void AppleATDecoder::SubmitSample(MediaRawData* aSample) { MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn()); if (mIsFlushing) { return; } MediaResult rv = NS_OK; if (!mConverter) { rv = SetupDecoder(aSample); if (rv != NS_OK && rv != NS_ERROR_NOT_INITIALIZED) { mCallback->Error(rv); return; } } mQueuedSamples.AppendElement(aSample); if (rv == NS_OK) { for (size_t i = 0; i < mQueuedSamples.Length(); i++) { rv = DecodeSample(mQueuedSamples[i]); if (NS_FAILED(rv)) { mErrored = true; mCallback->Error(rv); return; } } mQueuedSamples.Clear(); } mCallback->InputExhausted(); }
void AppleATDecoder::SubmitSample(nsAutoPtr<mp4_demuxer::MP4Sample> aSample) { nsresult rv = NS_OK; if (!mConverter) { rv = SetupDecoder(aSample); if (rv != NS_OK && rv != NS_ERROR_NOT_INITIALIZED) { mCallback->Error(); return; } } mQueuedSamples.AppendElement(aSample); if (rv == NS_OK) { for (size_t i = 0; i < mQueuedSamples.Length(); i++) { if (NS_FAILED(DecodeSample(mQueuedSamples[i]))) { mQueuedSamples.Clear(); mCallback->Error(); return; } } mQueuedSamples.Clear(); } if (mTaskQueue->IsEmpty()) { mCallback->InputExhausted(); } }
RefPtr<MediaDataDecoder::DecodePromise> AppleATDecoder::ProcessDecode(MediaRawData* aSample) { MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn()); MediaResult rv = NS_OK; if (!mConverter) { rv = SetupDecoder(aSample); if (rv != NS_OK && rv != NS_ERROR_NOT_INITIALIZED) { return DecodePromise::CreateAndReject(rv, __func__); } } mQueuedSamples.AppendElement(aSample); if (rv == NS_OK) { for (size_t i = 0; i < mQueuedSamples.Length(); i++) { rv = DecodeSample(mQueuedSamples[i]); if (NS_FAILED(rv)) { mErrored = true; return DecodePromise::CreateAndReject(rv, __func__); } } mQueuedSamples.Clear(); } return DecodePromise::CreateAndResolve(Move(mDecodedSamples), __func__); }
void CSubtitleInputPin::DecodeSamples() { SetThreadName(DWORD(-1), "Subtitle Input Pin Thread"); for (; !m_bExitDecodingThread;) { std::unique_lock<std::mutex> lock(m_mutexQueue); auto needStopProcessing = [this]() { return m_bStopDecoding || m_bExitDecodingThread; }; auto isQueueReady = [&]() { return !m_sampleQueue.IsEmpty() || needStopProcessing(); }; m_condQueueReady.wait(lock, isQueueReady); lock.unlock(); // Release this lock until we can acquire the other one REFERENCE_TIME rtInvalidate = -1; if (!needStopProcessing()) { CAutoLock cAutoLock(m_pSubLock); lock.lock(); // Reacquire the lock while (!m_sampleQueue.IsEmpty() && !needStopProcessing()) { auto pSample = m_sampleQueue.RemoveHead(); if (pSample) { REFERENCE_TIME rtSampleInvalidate = DecodeSample(pSample); if (rtSampleInvalidate >= 0 && (rtSampleInvalidate < rtInvalidate || rtInvalidate < 0)) { rtInvalidate = rtSampleInvalidate; } } else { // marker for end of stream if (IsRLECodedSub(&m_mt)) { CRLECodedSubtitle* pRLECodedSubtitle = (CRLECodedSubtitle*)(ISubStream*)m_pSubStream; pRLECodedSubtitle->EndOfStream(); } } } } if (rtInvalidate >= 0) { TRACE(_T("NewSegment: InvalidateSubtitle(%I64d, ...)\n"), rtInvalidate); // IMPORTANT: m_pSubLock must not be locked when calling this InvalidateSubtitle(rtInvalidate, m_pSubStream); } } }