diff options
Diffstat (limited to 'media')
5 files changed, 17 insertions, 1 deletions
diff --git a/media/libavextensions/mediaplayerservice/AVNuExtensions.h b/media/libavextensions/mediaplayerservice/AVNuExtensions.h index 7aeb5c3..1d45c00 100644 --- a/media/libavextensions/mediaplayerservice/AVNuExtensions.h +++ b/media/libavextensions/mediaplayerservice/AVNuExtensions.h @@ -85,6 +85,7 @@ struct AVNuUtils { virtual void printFileName(int fd); virtual void checkFormatChange(bool *formatChange, const sp<ABuffer> &accessUnit); + virtual bool dropCorruptFrame(); // ----- NO TRESSPASSING BEYOND THIS LINE ------ DECLARE_LOADABLE_SINGLETON(AVNuUtils); diff --git a/media/libavextensions/mediaplayerservice/AVNuUtils.cpp b/media/libavextensions/mediaplayerservice/AVNuUtils.cpp index 51c4a37..95f6454 100644 --- a/media/libavextensions/mediaplayerservice/AVNuUtils.cpp +++ b/media/libavextensions/mediaplayerservice/AVNuUtils.cpp @@ -112,6 +112,8 @@ bool AVNuUtils::canUseSetBuffers(const sp<MetaData> &/*Meta*/) { return false; } +bool AVNuUtils::dropCorruptFrame() { return false; } + // ----- NO TRESSPASSING BEYOND THIS LINE ------ AVNuUtils::AVNuUtils() {} diff --git a/media/libavextensions/stagefright/AVExtensions.h b/media/libavextensions/stagefright/AVExtensions.h index 937180f..0b70c08 100644 --- a/media/libavextensions/stagefright/AVExtensions.h +++ b/media/libavextensions/stagefright/AVExtensions.h @@ -47,7 +47,6 @@ struct ACodec; struct ALooper; struct IMediaHTTPConnection; struct MediaCodec; -struct MediaSource; struct MediaHTTP; struct NuCachedSource2; class CameraParameters; diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp index baea834..0bffafe 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp @@ -597,6 +597,14 @@ bool NuPlayer::Decoder::handleAnOutputBuffer( reply->setSize("buffer-ix", index); reply->setInt32("generation", mBufferGeneration); + if ((flags & MediaCodec::BUFFER_FLAG_DATACORRUPT) && + AVNuUtils::get()->dropCorruptFrame()) { + ALOGV("[%s] dropping corrupt buffer at time %lld as requested.", + mComponentName.c_str(), (long long)timeUs); + reply->post(); + return true; + } + if (eos) { ALOGI("[%s] saw output EOS", mIsAudio ? "audio" : "video"); diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index c6ba76e..c77d366 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -989,6 +989,9 @@ bool MediaCodec::handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool if (omxFlags & OMX_BUFFERFLAG_EXTRADATA) { flags |= BUFFER_FLAG_EXTRADATA; } + if (omxFlags & OMX_BUFFERFLAG_DATACORRUPT) { + flags |= BUFFER_FLAG_DATACORRUPT; + } response->setInt32("flags", flags); response->postReply(replyID); @@ -2633,6 +2636,9 @@ void MediaCodec::onOutputBufferAvailable() { if (omxFlags & OMX_BUFFERFLAG_EOS) { flags |= BUFFER_FLAG_EOS; } + if (omxFlags & OMX_BUFFERFLAG_DATACORRUPT) { + flags |= BUFFER_FLAG_DATACORRUPT; + } msg->setInt32("flags", flags); |