stagefright: explicitly mark discarded buffers
Return buffers always, but mark discarded buffers explicitly.
Bug: 33059528
Test: (manual) open a website with a looping video and see that it works.
Test: adb shell am instrument -e size small -w 'android.media.cts/android.support.test.runner.AndroidJUnitRunner'
Change-Id: Icbe12d09b5721747437592e11def2302f4c8bf79
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 21c90f0..4a02289 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -5513,9 +5513,8 @@
int32_t err = OK;
bool eos = false;
PortMode mode = getPortMode(kPortIndexInput);
-
- sp<RefBase> obj;
- if (!msg->findObject("buffer", &obj)) {
+ int32_t discarded = 0;
+ if (msg->findInt32("discarded", &discarded) && discarded) {
/* these are unfilled buffers returned by client */
CHECK(msg->findInt32("err", &err));
@@ -5527,9 +5526,10 @@
mCodec->mComponentName.c_str(), err);
eos = true;
}
- } else {
- buffer = static_cast<MediaCodecBuffer *>(obj.get());
}
+ sp<RefBase> obj;
+ CHECK(msg->findObject("buffer", &obj));
+ buffer = static_cast<MediaCodecBuffer *>(obj.get());
int32_t tmp;
if (buffer != NULL && buffer->meta()->findInt32("eos", &tmp) && tmp) {
@@ -5957,10 +5957,11 @@
IOMX::buffer_id bufferID;
CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID));
sp<RefBase> obj;
- sp<MediaCodecBuffer> buffer = nullptr;
- if (msg->findObject("buffer", &obj)) {
- buffer = static_cast<MediaCodecBuffer *>(obj.get());
- }
+ CHECK(msg->findObject("buffer", &obj));
+ sp<MediaCodecBuffer> buffer = static_cast<MediaCodecBuffer *>(obj.get());
+ int32_t discarded = 0;
+ msg->findInt32("discarded", &discarded);
+
ssize_t index;
BufferInfo *info = mCodec->findBufferByID(kPortIndexOutput, bufferID, &index);
BufferInfo::Status status = BufferInfo::getSafeStatus(info);
@@ -5992,7 +5993,7 @@
int32_t render;
if (mCodec->mNativeWindow != NULL
&& msg->findInt32("render", &render) && render != 0
- && buffer != NULL && buffer->size() != 0) {
+ && !discarded && buffer->size() != 0) {
ATRACE_NAME("render");
// The client wants this buffer to be rendered.
@@ -6031,8 +6032,7 @@
info->mIsReadFence = false;
}
} else {
- if (mCodec->mNativeWindow != NULL &&
- (buffer == NULL || buffer->size() != 0)) {
+ if (mCodec->mNativeWindow != NULL && (discarded || buffer->size() != 0)) {
// move read fence into write fence to avoid clobbering
info->mIsReadFence = false;
ATRACE_NAME("frame-drop");
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index 5382689..7c725ae 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -2361,6 +2361,9 @@
if (info->mNotify != NULL) {
sp<AMessage> msg = info->mNotify;
+ msg->setObject("buffer", (info->mSecureData != nullptr)
+ ? info->mSecureData : info->mData);
+ msg->setInt32("discarded", true);
info->mNotify = NULL;
if (isReclaim && info->mOwnedByClient) {
ALOGD("port %d buffer %zu still owned by client when codec is reclaimed",