diff options
-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 ab2f11d..d2bd9f2 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 875bc5b..9badf92 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 4f5ff75..89dada0 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -1593,21 +1593,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 a5341e3..5e4195e 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -356,7 +356,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.Nvidia.amr.decoder") || @@ -421,6 +422,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; } @@ -507,7 +515,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); @@ -1772,6 +1780,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 9d89c20..af9c70c 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) { |