diff options
| author | 2010-10-07 10:57:32 -0700 | |
|---|---|---|
| committer | 2010-10-07 10:57:32 -0700 | |
| commit | 02654f01bc6bd2e581b4a1d2409ecea217294fa2 (patch) | |
| tree | 7f8d37c6828b64633c81190e8f54886fb99695df | |
| parent | e0c5ae7b55f1eb49b0aed94339bfb8e3cd8fefb9 (diff) | |
| parent | 1e1941638398e5e3e1d7b9ad88e66f574576bcfa (diff) | |
Merge "On this particular device the hardware video decoder spits out buffers that don't actually contain our video data, so we cannot use them to restore the video frame after suspend/resume." into gingerbread
| -rw-r--r-- | include/media/stagefright/MetaData.h | 2 | ||||
| -rw-r--r-- | include/media/stagefright/OMXCodec.h | 4 | ||||
| -rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 37 | ||||
| -rw-r--r-- | media/libstagefright/OMXCodec.cpp | 16 | ||||
| -rw-r--r-- | media/libstagefright/StagefrightMetadataRetriever.cpp | 14 |
5 files changed, 56 insertions, 17 deletions
diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h index ab2f11dc36c6..d2bd9f2dd14d 100644 --- a/include/media/stagefright/MetaData.h +++ b/include/media/stagefright/MetaData.h @@ -97,6 +97,8 @@ enum { kKeyAutoLoop = 'autL', // bool (int32_t) kKeyValidSamples = 'valD', // int32_t + + kKeyIsUnreadable = 'unre', // bool (int32_t) }; enum { diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index 875bc5b58e20..9badf926c289 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -103,6 +103,7 @@ private: kSupportsMultipleFramesPerInputBuffer = 1024, kAvoidMemcopyInputRecordingFrames = 2048, kRequiresLargerEncoderOutputBuffer = 4096, + kOutputBuffersAreUnreadable = 8192, }; struct BufferInfo { @@ -249,7 +250,8 @@ private: status_t configureCodec(const sp<MetaData> &meta); - static uint32_t getComponentQuirks(const char *componentName); + static uint32_t getComponentQuirks( + const char *componentName, bool isEncoder); static void findMatchingCodecs( const char *mime, diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index bfc23d492105..3d0d1081479f 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -1571,21 +1571,30 @@ status_t AwesomePlayer::suspend() { if (mLastVideoBuffer) { size_t size = mLastVideoBuffer->range_length(); + if (size) { - state->mLastVideoFrameSize = size; - state->mLastVideoFrame = malloc(size); - memcpy(state->mLastVideoFrame, - (const uint8_t *)mLastVideoBuffer->data() - + mLastVideoBuffer->range_offset(), - size); - - state->mVideoWidth = mVideoWidth; - state->mVideoHeight = mVideoHeight; - - sp<MetaData> meta = mVideoSource->getFormat(); - CHECK(meta->findInt32(kKeyColorFormat, &state->mColorFormat)); - CHECK(meta->findInt32(kKeyWidth, &state->mDecodedWidth)); - CHECK(meta->findInt32(kKeyHeight, &state->mDecodedHeight)); + int32_t unreadable; + if (!mLastVideoBuffer->meta_data()->findInt32( + kKeyIsUnreadable, &unreadable) + || unreadable == 0) { + state->mLastVideoFrameSize = size; + state->mLastVideoFrame = malloc(size); + memcpy(state->mLastVideoFrame, + (const uint8_t *)mLastVideoBuffer->data() + + mLastVideoBuffer->range_offset(), + size); + + state->mVideoWidth = mVideoWidth; + state->mVideoHeight = mVideoHeight; + + sp<MetaData> meta = mVideoSource->getFormat(); + CHECK(meta->findInt32(kKeyColorFormat, &state->mColorFormat)); + CHECK(meta->findInt32(kKeyWidth, &state->mDecodedWidth)); + CHECK(meta->findInt32(kKeyHeight, &state->mDecodedHeight)); + } else { + LOGV("Unable to save last video frame, we have no access to " + "the decoded video data."); + } } } diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 76c8870207c0..e6cdac1471c2 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -346,7 +346,8 @@ static int CompareSoftwareCodecsFirst( } // static -uint32_t OMXCodec::getComponentQuirks(const char *componentName) { +uint32_t OMXCodec::getComponentQuirks( + const char *componentName, bool isEncoder) { uint32_t quirks = 0; if (!strcmp(componentName, "OMX.PV.avcdec")) { @@ -404,6 +405,13 @@ uint32_t OMXCodec::getComponentQuirks(const char *componentName) { quirks |= kInputBufferSizesAreBogus; } + if (!strncmp(componentName, "OMX.SEC.", 8) && !isEncoder) { + // These output buffers contain no video data, just some + // opaque information that allows the overlay to display their + // contents. + quirks |= kOutputBuffersAreUnreadable; + } + return quirks; } @@ -490,7 +498,7 @@ sp<MediaSource> OMXCodec::Create( LOGV("Successfully allocated OMX node '%s'", componentName); sp<OMXCodec> codec = new OMXCodec( - omx, node, getComponentQuirks(componentName), + omx, node, getComponentQuirks(componentName, createEncoder), createEncoder, mime, componentName, source); @@ -1747,6 +1755,10 @@ void OMXCodec::on_message(const omx_message &msg) { buffer->meta_data()->setInt32(kKeyIsCodecConfig, true); } + if (mQuirks & kOutputBuffersAreUnreadable) { + buffer->meta_data()->setInt32(kKeyIsUnreadable, true); + } + buffer->meta_data()->setPointer( kKeyPlatformPrivate, msg.u.extended_buffer_data.platform_private); diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp index 9d89c20b6da8..af9c70c230a3 100644 --- a/media/libstagefright/StagefrightMetadataRetriever.cpp +++ b/media/libstagefright/StagefrightMetadataRetriever.cpp @@ -159,6 +159,20 @@ static VideoFrame *extractVideoFrameWithCodecFlags( LOGV("successfully decoded video frame."); + int32_t unreadable; + if (buffer->meta_data()->findInt32(kKeyIsUnreadable, &unreadable) + && unreadable != 0) { + LOGV("video frame is unreadable, decoder does not give us access " + "to the video data."); + + buffer->release(); + buffer = NULL; + + decoder->stop(); + + return NULL; + } + int64_t timeUs; CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs)); if (thumbNailTime >= 0) { |