nsresult MediaCodecDataDecoder::ProcessOutput( BufferInfo::Param aInfo, MediaFormat::Param aFormat, int32_t aStatus) { AutoLocalJNIFrame frame(jni::GetEnvForThread(), 1); 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.value()); } // The Surface will be updated at this point (for video). mDecoder->ReleaseOutputBuffer(aStatus, true); PostOutput(aInfo, aFormat, duration.value()); return NS_OK; }
nsresult MediaCodecDataDecoder::ProcessOutput( BufferInfo::Param aInfo, MediaFormat::Param aFormat, int32_t aStatus) { AutoLocalJNIFrame frame(jni::GetEnvForThread(), 1); const TimeUnit duration = GetOutputDuration(); 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); } // The Surface will be updated at this point (for video). mDecoder->ReleaseOutputBuffer(aStatus, true); PostOutput(aInfo, aFormat, duration); return NS_OK; }