Bug 1363276 - Discard video output buffers according to presentation time rather than size. r=esawin, a=gchang
This works around an Android 4.2.2 bug that reports incorrect sizes for hardware buffers.
MozReview-Commit-ID: 4rAu8d1RwOJ
--- a/dom/media/platforms/android/RemoteDataDecoder.cpp
+++ b/dom/media/platforms/android/RemoteDataDecoder.cpp
@@ -175,33 +175,32 @@ public:
bool ok = NS_SUCCEEDED(info->Flags(&flags));
int32_t offset;
ok &= NS_SUCCEEDED(info->Offset(&offset));
int64_t presentationTimeUs;
ok &= NS_SUCCEEDED(info->PresentationTimeUs(&presentationTimeUs));
- int32_t size;
- ok &= NS_SUCCEEDED(info->Size(&size));
-
if (!ok) {
HandleError(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
RESULT_DETAIL("VideoCallBack::HandleOutput")));
return;
}
- bool isEOS = !!(flags & MediaCodec::BUFFER_FLAG_END_OF_STREAM);
+
InputInfo inputInfo;
- if (!mDecoder->mInputInfos.Find(presentationTimeUs, inputInfo)
- && !isEOS) {
+ ok = mDecoder->mInputInfos.Find(presentationTimeUs, inputInfo);
+ bool isEOS = !!(flags & MediaCodec::BUFFER_FLAG_END_OF_STREAM);
+ if (!ok && !isEOS) {
+ // Ignore output with no corresponding input.
return;
}
- if (size > 0) {
+ if (ok && presentationTimeUs >= 0) {
RefPtr<layers::Image> img = new SurfaceTextureImage(
mDecoder->mSurfaceTexture.get(), inputInfo.mImageSize,
gl::OriginPos::BottomLeft);
RefPtr<VideoData> v = VideoData::CreateFromImage(
inputInfo.mDisplaySize, offset, presentationTimeUs, inputInfo.mDurationUs,
img, !!(flags & MediaCodec::BUFFER_FLAG_SYNC_FRAME),
presentationTimeUs);