diff options
| author | Jamie Gennis <jgennis@google.com> | 2011-10-26 18:36:31 -0700 | 
|---|---|---|
| committer | Jamie Gennis <jgennis@google.com> | 2011-10-26 18:40:00 -0700 | 
| commit | 7dae00baa6e8957be15523c46bb948bd1dde64c3 (patch) | |
| tree | 195997b2a0541d250d8ad61ae08232046bbd62bd /media | |
| parent | 1765d6e0c962d2b89897c0278f969084f632d181 (diff) | |
| download | frameworks_av-7dae00baa6e8957be15523c46bb948bd1dde64c3.zip frameworks_av-7dae00baa6e8957be15523c46bb948bd1dde64c3.tar.gz frameworks_av-7dae00baa6e8957be15523c46bb948bd1dde64c3.tar.bz2  | |
Stagefright: ANW::connect in MediaPlayerService
This change moves the ANativeWindow connect and disconnect logic from
MediaPlayer to MediaPlayerService::Client.
Bug: 5502654
Change-Id: Ifc43b98b01ad8f35d62d7ece43110724ec7fda3d
Diffstat (limited to 'media')
| -rw-r--r-- | media/libmedia/mediaplayer.cpp | 98 | ||||
| -rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 59 | ||||
| -rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.h | 5 | 
3 files changed, 65 insertions, 97 deletions
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 37a82e9..f72300b 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -86,8 +86,6 @@ void MediaPlayer::disconnect()      if (p != 0) {          p->disconnect();      } - -    disconnectNativeWindow();  }  // always call with lock held @@ -221,63 +219,12 @@ status_t MediaPlayer::getMetadata(bool update_only, bool apply_filter, Parcel *m      return mPlayer->getMetadata(update_only, apply_filter, metadata);  } -void MediaPlayer::disconnectNativeWindow() { -    if (mConnectedWindow != NULL) { -        status_t err = native_window_api_disconnect(mConnectedWindow.get(), -                NATIVE_WINDOW_API_MEDIA); - -        if (err != OK) { -            LOGW("native_window_api_disconnect returned an error: %s (%d)", -                    strerror(-err), err); -        } -    } -    mConnectedWindow.clear(); -} -  status_t MediaPlayer::setVideoSurface(const sp<Surface>& surface)  {      LOGV("setVideoSurface");      Mutex::Autolock _l(mLock);      if (mPlayer == 0) return NO_INIT; - -    sp<IBinder> binder(surface == NULL ? NULL : surface->asBinder()); -    if (mConnectedWindowBinder == binder) { -        return OK; -    } - -    if (surface != NULL) { -        status_t err = native_window_api_connect(surface.get(), -                NATIVE_WINDOW_API_MEDIA); - -        if (err != OK) { -            LOGE("setVideoSurface failed: %d", err); -            // Note that we must do the reset before disconnecting from the ANW. -            // Otherwise queue/dequeue calls could be made on the disconnected -            // ANW, which may result in errors. -            reset_l(); - -            disconnectNativeWindow(); - -            return err; -        } -    } - -    // Note that we must set the player's new surface before disconnecting the -    // old one.  Otherwise queue/dequeue calls could be made on the disconnected -    // ANW, which may result in errors. -    status_t err = mPlayer->setVideoSurface(surface); - -    disconnectNativeWindow(); - -    mConnectedWindow = surface; - -    if (err == OK) { -        mConnectedWindowBinder = binder; -    } else { -        disconnectNativeWindow(); -    } - -    return err; +    return mPlayer->setVideoSurface(surface);  }  status_t MediaPlayer::setVideoSurfaceTexture( @@ -286,48 +233,7 @@ status_t MediaPlayer::setVideoSurfaceTexture(      LOGV("setVideoSurfaceTexture");      Mutex::Autolock _l(mLock);      if (mPlayer == 0) return NO_INIT; - -    sp<IBinder> binder(surfaceTexture == NULL ? NULL : -            surfaceTexture->asBinder()); -    if (mConnectedWindowBinder == binder) { -        return OK; -    } - -    sp<ANativeWindow> anw; -    if (surfaceTexture != NULL) { -        anw = new SurfaceTextureClient(surfaceTexture); -        status_t err = native_window_api_connect(anw.get(), -                NATIVE_WINDOW_API_MEDIA); - -        if (err != OK) { -            LOGE("setVideoSurfaceTexture failed: %d", err); -            // Note that we must do the reset before disconnecting from the ANW. -            // Otherwise queue/dequeue calls could be made on the disconnected -            // ANW, which may result in errors. -            reset_l(); - -            disconnectNativeWindow(); - -            return err; -        } -    } - -    // Note that we must set the player's new SurfaceTexture before -    // disconnecting the old one.  Otherwise queue/dequeue calls could be made -    // on the disconnected ANW, which may result in errors. -    status_t err = mPlayer->setVideoSurfaceTexture(surfaceTexture); - -    disconnectNativeWindow(); - -    mConnectedWindow = anw; - -    if (err == OK) { -        mConnectedWindowBinder = binder; -    } else { -        disconnectNativeWindow(); -    } - -    return err; +    return mPlayer->setVideoSurfaceTexture(surfaceTexture);  }  // must call with lock held diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 3ebe989..ba9f54f 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -40,6 +40,7 @@  #include <binder/IServiceManager.h>  #include <binder/MemoryHeapBase.h>  #include <binder/MemoryBase.h> +#include <gui/SurfaceTextureClient.h>  #include <utils/Errors.h>  // for status_t  #include <utils/String8.h>  #include <utils/SystemClock.h> @@ -528,6 +529,8 @@ void MediaPlayerService::Client::disconnect()          p->reset();      } +    disconnectNativeWindow(); +      IPCThreadState::self()->flushCommands();  } @@ -789,13 +792,67 @@ status_t MediaPlayerService::Client::setVideoSurface(const sp<Surface>& surface)      return p->setVideoSurface(surface);  } +void MediaPlayerService::Client::disconnectNativeWindow() { +    if (mConnectedWindow != NULL) { +        status_t err = native_window_api_disconnect(mConnectedWindow.get(), +                NATIVE_WINDOW_API_MEDIA); + +        if (err != OK) { +            LOGW("native_window_api_disconnect returned an error: %s (%d)", +                    strerror(-err), err); +        } +    } +    mConnectedWindow.clear(); +} +  status_t MediaPlayerService::Client::setVideoSurfaceTexture(          const sp<ISurfaceTexture>& surfaceTexture)  {      LOGV("[%d] setVideoSurfaceTexture(%p)", mConnId, surfaceTexture.get());      sp<MediaPlayerBase> p = getPlayer();      if (p == 0) return UNKNOWN_ERROR; -    return p->setVideoSurfaceTexture(surfaceTexture); + +    sp<IBinder> binder(surfaceTexture == NULL ? NULL : +            surfaceTexture->asBinder()); +    if (mConnectedWindowBinder == binder) { +        return OK; +    } + +    sp<ANativeWindow> anw; +    if (surfaceTexture != NULL) { +        anw = new SurfaceTextureClient(surfaceTexture); +        status_t err = native_window_api_connect(anw.get(), +                NATIVE_WINDOW_API_MEDIA); + +        if (err != OK) { +            LOGE("setVideoSurfaceTexture failed: %d", err); +            // Note that we must do the reset before disconnecting from the ANW. +            // Otherwise queue/dequeue calls could be made on the disconnected +            // ANW, which may result in errors. +            reset(); + +            disconnectNativeWindow(); + +            return err; +        } +    } + +    // Note that we must set the player's new SurfaceTexture before +    // disconnecting the old one.  Otherwise queue/dequeue calls could be made +    // on the disconnected ANW, which may result in errors. +    status_t err = p->setVideoSurfaceTexture(surfaceTexture); + +    disconnectNativeWindow(); + +    mConnectedWindow = anw; + +    if (err == OK) { +        mConnectedWindowBinder = binder; +    } else { +        disconnectNativeWindow(); +    } + +    return err;  }  status_t MediaPlayerService::Client::invoke(const Parcel& request, diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 53e625a..62214ba 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -318,6 +318,9 @@ private:          // @param type Of the metadata to be recorded.          void addNewMetadataUpdate(media::Metadata::Type type); +        // Disconnect from the currently connected ANativeWindow. +        void disconnectNativeWindow(); +          mutable     Mutex                       mLock;                      sp<MediaPlayerBase>         mPlayer;                      sp<MediaPlayerService>      mService; @@ -329,6 +332,8 @@ private:                      int32_t                     mConnId;                      int                         mAudioSessionId;                      uid_t                       mUID; +                    sp<ANativeWindow>           mConnectedWindow; +                    sp<IBinder>                 mConnectedWindowBinder;          // Metadata filters.          media::Metadata::Filter mMetadataAllow;  // protected by mLock  | 
