diff options
author | Glenn Kasten <gkasten@google.com> | 2011-02-08 17:26:17 -0800 |
---|---|---|
committer | Glenn Kasten <gkasten@google.com> | 2011-02-23 15:02:56 -0800 |
commit | 1173118eace0e9e347cb007f0da817cee87579ed (patch) | |
tree | d2d23b2120010097d1edda29cd0adffd938105c3 /media/libstagefright/AwesomePlayer.cpp | |
parent | f7f3e824a8cb2b38355db8e4f99e43b90ee71ce4 (diff) | |
download | frameworks_av-1173118eace0e9e347cb007f0da817cee87579ed.zip frameworks_av-1173118eace0e9e347cb007f0da817cee87579ed.tar.gz frameworks_av-1173118eace0e9e347cb007f0da817cee87579ed.tar.bz2 |
Bug 3438258 Add SurfaceTexture as MediaPlayer sink
This change enables the use of a SurfaceTexture in place of a Surface
as the video sink for an android.media.MediaPlayer. The new API
MediaPlayer.setTexture is currently hidden.
This includes:
- New Java and C++ interfaces
- C++ plumbing and implementation (JNI, Binder)
- Stagefright AwesomePlayer and NuPlayer use ANativeWindow
(either Surface or SurfaceTextureClient)
Change-Id: I2b568bee143d9eaf3dfc6cc4533c1bebbd5afc51
Diffstat (limited to 'media/libstagefright/AwesomePlayer.cpp')
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 1b63ab2..36623f6 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -43,6 +43,8 @@ #include <media/stagefright/OMXCodec.h> #include <surfaceflinger/Surface.h> +#include <gui/ISurfaceTexture.h> +#include <gui/SurfaceTextureClient.h> #include <media/stagefright/foundation/ALooper.h> #include <media/stagefright/foundation/AMessage.h> @@ -83,8 +85,8 @@ private: struct AwesomeLocalRenderer : public AwesomeRenderer { AwesomeLocalRenderer( - const sp<Surface> &surface, const sp<MetaData> &meta) - : mTarget(new SoftwareRenderer(surface, meta)) { + const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta) + : mTarget(new SoftwareRenderer(nativeWindow, meta)) { } virtual void render(MediaBuffer *buffer) { @@ -889,7 +891,7 @@ void AwesomePlayer::notifyVideoSize_l() { } void AwesomePlayer::initRenderer_l() { - if (mSurface == NULL) { + if (mNativeWindow == NULL) { return; } @@ -920,13 +922,13 @@ void AwesomePlayer::initRenderer_l() { // directly to ANativeBuffers, so we must use a renderer that // just pushes those buffers to the ANativeWindow. mVideoRenderer = - new AwesomeNativeWindowRenderer(mSurface, rotationDegrees); + new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees); } else { // Other decoders are instantiated locally and as a consequence // allocate their buffers in local address space. This renderer // then performs a color conversion and copy to get the data // into the ANativeBuffer. - mVideoRenderer = new AwesomeLocalRenderer(mSurface, meta); + mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta); } } @@ -986,6 +988,17 @@ void AwesomePlayer::setSurface(const sp<Surface> &surface) { Mutex::Autolock autoLock(mLock); mSurface = surface; + mNativeWindow = surface; +} + +void AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { + Mutex::Autolock autoLock(mLock); + + mSurface.clear(); + if (surfaceTexture != NULL) { + mNativeWindow = new SurfaceTextureClient(surfaceTexture); + } + } void AwesomePlayer::setAudioSink( @@ -1164,7 +1177,7 @@ status_t AwesomePlayer::initVideoDecoder(uint32_t flags) { mClient.interface(), mVideoTrack->getFormat(), false, // createEncoder mVideoTrack, - NULL, flags, USE_SURFACE_ALLOC ? mSurface : NULL); + NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL); if (mVideoSource != NULL) { int64_t durationUs; |