Back out 30a8392db2c2 (bug 1198094) for mQueuedSamples assertion failures

This commit is contained in:
Phil Ringnalda 2015-08-26 22:09:40 -07:00
parent 02603b885d
commit 1e59442474
3 changed files with 17 additions and 39 deletions

View File

@ -44,7 +44,6 @@ AppleVDADecoder::AppleVDADecoder(const VideoInfo& aConfig,
, mIsShutDown(false) , mIsShutDown(false)
, mUseSoftwareImages(false) , mUseSoftwareImages(false)
, mIs106(!nsCocoaFeatures::OnLionOrLater()) , mIs106(!nsCocoaFeatures::OnLionOrLater())
, mQueuedSamples(0)
, mMonitor("AppleVideoDecoder") , mMonitor("AppleVideoDecoder")
, mIsFlushing(false) , mIsFlushing(false)
, mDecoder(nullptr) , mDecoder(nullptr)
@ -214,13 +213,15 @@ PlatformCallback(void* decompressionOutputRefCon,
// FIXME: Distinguish between errors and empty flushed frames. // FIXME: Distinguish between errors and empty flushed frames.
if (status != noErr || !image) { if (status != noErr || !image) {
NS_WARNING("AppleVDADecoder decoder returned no data"); NS_WARNING("AppleVDADecoder decoder returned no data");
image = nullptr; return;
} else if (infoFlags & kVDADecodeInfo_FrameDropped) { }
MOZ_ASSERT(CFGetTypeID(image) == CVPixelBufferGetTypeID(),
"AppleVDADecoder returned an unexpected image type");
if (infoFlags & kVDADecodeInfo_FrameDropped)
{
NS_WARNING(" ...frame dropped..."); NS_WARNING(" ...frame dropped...");
image = nullptr; return;
} else {
MOZ_ASSERT(image || CFGetTypeID(image) == CVPixelBufferGetTypeID(),
"AppleVDADecoder returned an unexpected image type");
} }
AppleVDADecoder* decoder = AppleVDADecoder* decoder =
@ -277,7 +278,6 @@ AppleVDADecoder::DrainReorderedFrames()
while (!mReorderQueue.IsEmpty()) { while (!mReorderQueue.IsEmpty()) {
mCallback->Output(mReorderQueue.Pop().get()); mCallback->Output(mReorderQueue.Pop().get());
} }
mQueuedSamples = 0;
} }
void void
@ -286,7 +286,6 @@ AppleVDADecoder::ClearReorderedFrames()
while (!mReorderQueue.IsEmpty()) { while (!mReorderQueue.IsEmpty()) {
mReorderQueue.Pop(); mReorderQueue.Pop();
} }
mQueuedSamples = 0;
} }
// Copy and return a decoded frame. // Copy and return a decoded frame.
@ -309,19 +308,6 @@ AppleVDADecoder::OutputFrame(CFRefPtr<CVPixelBufferRef> aImage,
aFrameRef.is_sync_point ? " keyframe" : "" aFrameRef.is_sync_point ? " keyframe" : ""
); );
if (mQueuedSamples > mMaxRefFrames) {
// We had stopped requesting more input because we had received too much at
// the time. We can ask for more once again.
mCallback->InputExhausted();
}
MOZ_ASSERT(mQueuedSamples);
mQueuedSamples--;
if (!aImage) {
// Image was dropped by decoder.
return NS_OK;
}
// Where our resulting image will end up. // Where our resulting image will end up.
nsRefPtr<VideoData> data; nsRefPtr<VideoData> data;
// Bounds. // Bounds.
@ -485,8 +471,6 @@ AppleVDADecoder::SubmitFrame(MediaRawData* aSample)
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks); &kCFTypeDictionaryValueCallBacks);
mQueuedSamples++;
OSStatus rv = VDADecoderDecode(mDecoder, OSStatus rv = VDADecoderDecode(mDecoder,
0, 0,
block, block,
@ -510,7 +494,7 @@ AppleVDADecoder::SubmitFrame(MediaRawData* aSample)
} }
// Ask for more data. // Ask for more data.
if (!mInputIncoming && mQueuedSamples <= mMaxRefFrames) { if (!mInputIncoming) {
LOG("AppleVDADecoder task queue empty; requesting more data"); LOG("AppleVDADecoder task queue empty; requesting more data");
mCallback->InputExhausted(); mCallback->InputExhausted();
} }

View File

@ -122,11 +122,6 @@ protected:
bool mUseSoftwareImages; bool mUseSoftwareImages;
bool mIs106; bool mIs106;
// Number of times a sample was queued via Input(). Will be decreased upon
// the decoder's callback being invoked.
// This is used to calculate how many frames has been buffered by the decoder.
uint32_t mQueuedSamples;
// For wait on mIsFlushing during Shutdown() process. // For wait on mIsFlushing during Shutdown() process.
Monitor mMonitor; Monitor mMonitor;
// Set on reader/decode thread calling Flush() to indicate that output is // Set on reader/decode thread calling Flush() to indicate that output is

View File

@ -167,13 +167,14 @@ PlatformCallback(void* decompressionOutputRefCon,
// Validate our arguments. // Validate our arguments.
if (status != noErr || !image) { if (status != noErr || !image) {
NS_WARNING("VideoToolbox decoder returned no data"); NS_WARNING("VideoToolbox decoder returned no data");
image = nullptr; return;
} else if (flags & kVTDecodeInfo_FrameDropped) {
NS_WARNING(" ...frame tagged as dropped...");
} else {
MOZ_ASSERT(CFGetTypeID(image) == CVPixelBufferGetTypeID(),
"VideoToolbox returned an unexpected image type");
} }
if (flags & kVTDecodeInfo_FrameDropped) {
NS_WARNING(" ...frame tagged as dropped...");
}
MOZ_ASSERT(CFGetTypeID(image) == CVPixelBufferGetTypeID(),
"VideoToolbox returned an unexpected image type");
nsCOMPtr<nsIRunnable> task = nsCOMPtr<nsIRunnable> task =
NS_NewRunnableMethodWithArgs<CFRefPtr<CVPixelBufferRef>, AppleVTDecoder::AppleFrameRef>( NS_NewRunnableMethodWithArgs<CFRefPtr<CVPixelBufferRef>, AppleVTDecoder::AppleFrameRef>(
decoder, &AppleVTDecoder::OutputFrame, image, *frameRef); decoder, &AppleVTDecoder::OutputFrame, image, *frameRef);
@ -241,8 +242,6 @@ AppleVTDecoder::SubmitFrame(MediaRawData* aSample)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
mQueuedSamples++;
VTDecodeFrameFlags decodeFlags = VTDecodeFrameFlags decodeFlags =
kVTDecodeFrame_EnableAsynchronousDecompression; kVTDecodeFrame_EnableAsynchronousDecompression;
rv = VTDecompressionSessionDecodeFrame(mSession, rv = VTDecompressionSessionDecodeFrame(mSession,
@ -258,7 +257,7 @@ AppleVTDecoder::SubmitFrame(MediaRawData* aSample)
} }
// Ask for more data. // Ask for more data.
if (!mInputIncoming && mQueuedSamples <= mMaxRefFrames) { if (!mInputIncoming) {
LOG("AppleVTDecoder task queue empty; requesting more data"); LOG("AppleVTDecoder task queue empty; requesting more data");
mCallback->InputExhausted(); mCallback->InputExhausted();
} }