summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/AwesomePlayer.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-11-30 11:53:01 -0800
committerAndroid Git Automerger <android-git-automerger@android.com>2010-11-30 11:53:01 -0800
commit2d6dbfb5e3f16d800d2e0b5da283001e53e72768 (patch)
treea730ae940cef153c23c09a070ff58cae36f97dba /media/libstagefright/AwesomePlayer.cpp
parentecd0a4f0b5bdd51bc35097b402202d6349f016ba (diff)
parent4d0565de200e61f457e4d97fcfbc4c9ccd81bdad (diff)
downloadframeworks_av-2d6dbfb5e3f16d800d2e0b5da283001e53e72768.zip
frameworks_av-2d6dbfb5e3f16d800d2e0b5da283001e53e72768.tar.gz
frameworks_av-2d6dbfb5e3f16d800d2e0b5da283001e53e72768.tar.bz2
am b690e55d: Merge "DO NOT MERGE - Instead of asserting that ISurface successfully registered buffers, report an error and propagate it up to the java client." into gingerbread
* commit 'b690e55d3f713d68c6ed9654a05a5370bda731d5': DO NOT MERGE - Instead of asserting that ISurface successfully registered buffers, report an error and propagate it up to the java client.
Diffstat (limited to 'media/libstagefright/AwesomePlayer.cpp')
-rw-r--r--media/libstagefright/AwesomePlayer.cpp146
1 files changed, 92 insertions, 54 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 0bc4062..49fa24b 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -82,6 +82,10 @@ struct AwesomeRemoteRenderer : public AwesomeRenderer {
: mTarget(target) {
}
+ virtual status_t initCheck() const {
+ return OK;
+ }
+
virtual void render(MediaBuffer *buffer) {
void *id;
if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) {
@@ -105,14 +109,19 @@ struct AwesomeLocalRenderer : public AwesomeRenderer {
size_t displayWidth, size_t displayHeight,
size_t decodedWidth, size_t decodedHeight,
int32_t rotationDegrees)
- : mTarget(NULL),
+ : mInitCheck(NO_INIT),
+ mTarget(NULL),
mLibHandle(NULL) {
- init(previewOnly, componentName,
+ mInitCheck = init(previewOnly, componentName,
colorFormat, surface, displayWidth,
displayHeight, decodedWidth, decodedHeight,
rotationDegrees);
}
+ virtual status_t initCheck() const {
+ return mInitCheck;
+ }
+
virtual void render(MediaBuffer *buffer) {
render((const uint8_t *)buffer->data() + buffer->range_offset(),
buffer->range_length());
@@ -134,10 +143,11 @@ protected:
}
private:
+ status_t mInitCheck;
VideoRenderer *mTarget;
void *mLibHandle;
- void init(
+ status_t init(
bool previewOnly,
const char *componentName,
OMX_COLOR_FORMATTYPE colorFormat,
@@ -150,7 +160,7 @@ private:
AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
};
-void AwesomeLocalRenderer::init(
+status_t AwesomeLocalRenderer::init(
bool previewOnly,
const char *componentName,
OMX_COLOR_FORMATTYPE colorFormat,
@@ -215,11 +225,15 @@ void AwesomeLocalRenderer::init(
}
}
- if (mTarget == NULL) {
- mTarget = new SoftwareRenderer(
- colorFormat, surface, displayWidth, displayHeight,
- decodedWidth, decodedHeight, rotationDegrees);
+ if (mTarget != NULL) {
+ return OK;
}
+
+ mTarget = new SoftwareRenderer(
+ colorFormat, surface, displayWidth, displayHeight,
+ decodedWidth, decodedHeight, rotationDegrees);
+
+ return ((SoftwareRenderer *)mTarget)->initCheck();
}
AwesomePlayer::AwesomePlayer()
@@ -830,53 +844,64 @@ status_t AwesomePlayer::play_l() {
return OK;
}
-void AwesomePlayer::initRenderer_l() {
- if (mISurface != NULL) {
- sp<MetaData> meta = mVideoSource->getFormat();
-
- int32_t format;
- const char *component;
- int32_t decodedWidth, decodedHeight;
- CHECK(meta->findInt32(kKeyColorFormat, &format));
- CHECK(meta->findCString(kKeyDecoderComponent, &component));
- CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
- CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
-
- int32_t rotationDegrees;
- if (!mVideoTrack->getFormat()->findInt32(
- kKeyRotation, &rotationDegrees)) {
- rotationDegrees = 0;
- }
+status_t AwesomePlayer::initRenderer_l() {
+ if (mISurface == NULL) {
+ return OK;
+ }
- mVideoRenderer.clear();
+ sp<MetaData> meta = mVideoSource->getFormat();
- // Must ensure that mVideoRenderer's destructor is actually executed
- // before creating a new one.
- IPCThreadState::self()->flushCommands();
+ int32_t format;
+ const char *component;
+ int32_t decodedWidth, decodedHeight;
+ CHECK(meta->findInt32(kKeyColorFormat, &format));
+ CHECK(meta->findCString(kKeyDecoderComponent, &component));
+ CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
+ CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
- if (!strncmp("OMX.", component, 4)) {
- // Our OMX codecs allocate buffers on the media_server side
- // therefore they require a remote IOMXRenderer that knows how
- // to display them.
- mVideoRenderer = new AwesomeRemoteRenderer(
- mClient.interface()->createRenderer(
- mISurface, component,
- (OMX_COLOR_FORMATTYPE)format,
- decodedWidth, decodedHeight,
- mVideoWidth, mVideoHeight,
- rotationDegrees));
- } else {
- // Other decoders are instantiated locally and as a consequence
- // allocate their buffers in local address space.
- mVideoRenderer = new AwesomeLocalRenderer(
- false, // previewOnly
- component,
- (OMX_COLOR_FORMATTYPE)format,
- mISurface,
- mVideoWidth, mVideoHeight,
- decodedWidth, decodedHeight, rotationDegrees);
- }
+ int32_t rotationDegrees;
+ if (!mVideoTrack->getFormat()->findInt32(
+ kKeyRotation, &rotationDegrees)) {
+ rotationDegrees = 0;
}
+
+ mVideoRenderer.clear();
+
+ // Must ensure that mVideoRenderer's destructor is actually executed
+ // before creating a new one.
+ IPCThreadState::self()->flushCommands();
+
+ if (!strncmp("OMX.", component, 4)) {
+ // Our OMX codecs allocate buffers on the media_server side
+ // therefore they require a remote IOMXRenderer that knows how
+ // to display them.
+
+ sp<IOMXRenderer> native =
+ mClient.interface()->createRenderer(
+ mISurface, component,
+ (OMX_COLOR_FORMATTYPE)format,
+ decodedWidth, decodedHeight,
+ mVideoWidth, mVideoHeight,
+ rotationDegrees);
+
+ if (native == NULL) {
+ return NO_INIT;
+ }
+
+ mVideoRenderer = new AwesomeRemoteRenderer(native);
+ } else {
+ // Other decoders are instantiated locally and as a consequence
+ // allocate their buffers in local address space.
+ mVideoRenderer = new AwesomeLocalRenderer(
+ false, // previewOnly
+ component,
+ (OMX_COLOR_FORMATTYPE)format,
+ mISurface,
+ mVideoWidth, mVideoHeight,
+ decodedWidth, decodedHeight, rotationDegrees);
+ }
+
+ return mVideoRenderer->initCheck();
}
status_t AwesomePlayer::pause() {
@@ -1217,9 +1242,14 @@ void AwesomePlayer::onVideoEvent() {
if (mVideoRenderer != NULL) {
mVideoRendererIsPreview = false;
- initRenderer_l();
+ err = initRenderer_l();
+
+ if (err == OK) {
+ continue;
+ }
+
+ // fall through
}
- continue;
}
// So video playback is complete, but we may still have
@@ -1310,7 +1340,15 @@ void AwesomePlayer::onVideoEvent() {
if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
mVideoRendererIsPreview = false;
- initRenderer_l();
+ status_t err = initRenderer_l();
+
+ if (err != OK) {
+ finishSeekIfNecessary(-1);
+
+ mFlags |= VIDEO_AT_EOS;
+ postStreamDoneEvent_l(err);
+ return;
+ }
}
if (mVideoRenderer != NULL) {