void MediaDecoder::UnpinForSeek() { MediaResource* resource = GetResource(); if (!resource || !mPinnedForSeek) { return; } mPinnedForSeek = false; resource->Unpin(); }
void MediaDecoder::UnpinForSeek() { MOZ_ASSERT(NS_IsMainThread()); MediaResource* resource = GetResource(); if (!resource || !mPinnedForSeek) { return; } mPinnedForSeek = false; resource->Unpin(); }
nsresult nsDASHReader::GetBuffered(nsTimeRanges* aBuffered, int64_t aStartTime) { NS_ENSURE_ARG(aBuffered); MediaResource* resource = nullptr; nsBuiltinDecoder* decoder = nullptr; // Need to find intersect of |nsTimeRanges| for audio and video. nsTimeRanges audioBuffered, videoBuffered; uint32_t audioRangeCount, videoRangeCount; nsresult rv = NS_OK; // First, get buffered ranges for sub-readers. ReentrantMonitorConditionallyEnter mon(!mDecoder->OnDecodeThread(), mDecoder->GetReentrantMonitor()); if (mAudioReader) { decoder = mAudioReader->GetDecoder(); NS_ENSURE_TRUE(decoder, NS_ERROR_NULL_POINTER); resource = decoder->GetResource(); NS_ENSURE_TRUE(resource, NS_ERROR_NULL_POINTER); resource->Pin(); rv = mAudioReader->GetBuffered(&audioBuffered, aStartTime); NS_ENSURE_SUCCESS(rv, rv); resource->Unpin(); rv = audioBuffered.GetLength(&audioRangeCount); NS_ENSURE_SUCCESS(rv, rv); } if (mVideoReader) { decoder = mVideoReader->GetDecoder(); NS_ENSURE_TRUE(decoder, NS_ERROR_NULL_POINTER); resource = decoder->GetResource(); NS_ENSURE_TRUE(resource, NS_ERROR_NULL_POINTER); resource->Pin(); rv = mVideoReader->GetBuffered(&videoBuffered, aStartTime); NS_ENSURE_SUCCESS(rv, rv); resource->Unpin(); rv = videoBuffered.GetLength(&videoRangeCount); NS_ENSURE_SUCCESS(rv, rv); } // Now determine buffered data for available sub-readers. if (mAudioReader && mVideoReader) { // Calculate intersecting ranges. for (uint32_t i = 0; i < audioRangeCount; i++) { // |A|udio, |V|ideo, |I|ntersect. double startA, startV, startI; double endA, endV, endI; rv = audioBuffered.Start(i, &startA); NS_ENSURE_SUCCESS(rv, rv); rv = audioBuffered.End(i, &endA); NS_ENSURE_SUCCESS(rv, rv); for (uint32_t j = 0; j < videoRangeCount; j++) { rv = videoBuffered.Start(i, &startV); NS_ENSURE_SUCCESS(rv, rv); rv = videoBuffered.End(i, &endV); NS_ENSURE_SUCCESS(rv, rv); // If video block is before audio block, compare next video block. if (startA > endV) { continue; // If video block is after audio block, all of them are; compare next // audio block. } else if (endA < startV) { break; } // Calculate intersections of current audio and video blocks. startI = (startA > startV) ? startA : startV; endI = (endA > endV) ? endV : endA; aBuffered->Add(startI, endI); } } } else if (mAudioReader) { *aBuffered = audioBuffered; } else if (mVideoReader) { *aBuffered = videoBuffered; } else { return NS_ERROR_NOT_INITIALIZED; } return NS_OK; }