Bug 1273523 - [1.2] Don't process output if no duration is available. r=snorp

This commit is contained in:
Eugen Sawin 2016-05-17 19:47:01 +02:00
parent 7060edb007
commit e98e0d70e0
2 changed files with 17 additions and 7 deletions

View File

@ -549,11 +549,13 @@ MediaCodecDataDecoder::HandleEOS(int32_t aOutputStatus)
mDecoder->ReleaseOutputBuffer(aOutputStatus, false);
}
TimeUnit
Maybe<TimeUnit>
MediaCodecDataDecoder::GetOutputDuration()
{
MOZ_ASSERT(!mDurations.empty(), "Should have had a duration queued");
const TimeUnit duration = mDurations.front();
if (mDurations.empty()) {
return Nothing();
}
const Maybe<TimeUnit> duration = Some(mDurations.front());
mDurations.pop_front();
return duration;
}
@ -564,19 +566,26 @@ MediaCodecDataDecoder::ProcessOutput(
{
AutoLocalJNIFrame frame(jni::GetEnvForThread(), 1);
const TimeUnit duration = GetOutputDuration();
const Maybe<TimeUnit> duration = GetOutputDuration();
if (!duration) {
// Some devices report failure in QueueSample while actually succeeding at
// it, in which case we get an output buffer without having a cached duration
// (bug 1273523).
return NS_OK;
}
const auto buffer = jni::Object::LocalRef::Adopt(
frame.GetEnv()->GetObjectArrayElement(mOutputBuffers.Get(), aStatus));
if (buffer) {
// The buffer will be null on Android L if we are decoding to a Surface.
void* directBuffer = frame.GetEnv()->GetDirectBufferAddress(buffer.Get());
Output(aInfo, directBuffer, aFormat, duration);
Output(aInfo, directBuffer, aFormat, duration.value());
}
// The Surface will be updated at this point (for video).
mDecoder->ReleaseOutputBuffer(aStatus, true);
PostOutput(aInfo, aFormat, duration);
PostOutput(aInfo, aFormat, duration.value());
return NS_OK;
}

View File

@ -11,6 +11,7 @@
#include "SurfaceTexture.h"
#include "TimeUnits.h"
#include "mozilla/Monitor.h"
#include "mozilla/Maybe.h"
#include <deque>
@ -105,7 +106,7 @@ protected:
nsresult QueueSample(const MediaRawData* aSample);
nsresult QueueEOS();
void HandleEOS(int32_t aOutputStatus);
media::TimeUnit GetOutputDuration();
Maybe<media::TimeUnit> GetOutputDuration();
nsresult ProcessOutput(widget::sdk::BufferInfo::Param aInfo,
widget::sdk::MediaFormat::Param aFormat,
int32_t aStatus);