summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/stagefright/MediaCodec.h1
-rw-r--r--media/libavextensions/mediaplayerservice/AVNuExtensions.h1
-rw-r--r--media/libavextensions/mediaplayerservice/AVNuUtils.cpp2
-rw-r--r--media/libavextensions/stagefright/AVExtensions.h1
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp8
-rw-r--r--media/libstagefright/MediaCodec.cpp6
6 files changed, 18 insertions, 1 deletions
diff --git a/include/media/stagefright/MediaCodec.h b/include/media/stagefright/MediaCodec.h
index b0ae83b..9c489e5 100644
--- a/include/media/stagefright/MediaCodec.h
+++ b/include/media/stagefright/MediaCodec.h
@@ -52,6 +52,7 @@ struct MediaCodec : public AHandler {
BUFFER_FLAG_CODECCONFIG = 2,
BUFFER_FLAG_EOS = 4,
BUFFER_FLAG_EXTRADATA = 0x1000,
+ BUFFER_FLAG_DATACORRUPT = 0x2000,
};
enum {
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);