mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-25 19:25:43 +00:00
Bug 1273523 - [1.2] Don't process output if no duration is available. r=snorp
This commit is contained in:
parent
7060edb007
commit
e98e0d70e0
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user