summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/AwesomePlayer.cpp
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2011-02-08 17:26:17 -0800
committerGlenn Kasten <gkasten@google.com>2011-02-23 15:02:56 -0800
commit1173118eace0e9e347cb007f0da817cee87579ed (patch)
treed2d23b2120010097d1edda29cd0adffd938105c3 /media/libstagefright/AwesomePlayer.cpp
parentf7f3e824a8cb2b38355db8e4f99e43b90ee71ce4 (diff)
downloadframeworks_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.cpp25
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;