nsresult WMFReader::Seek(int64_t aTargetUs, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) { LOG("WMFReader::Seek() %lld", aTargetUs); NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); #ifdef DEBUG bool canSeek = false; GetSourceReaderCanSeek(mSourceReader, canSeek); NS_ASSERTION(canSeek, "WMFReader::Seek() should only be called if we can seek!"); #endif nsresult rv = ResetDecode(); NS_ENSURE_SUCCESS(rv, rv); // Mark that we must recapture the audio frame count from the next sample. // WMF doesn't set a discontinuity marker when we seek to time 0, so we // must remember to recapture the audio frame offset and reset the frame // sum on the next audio packet we decode. mMustRecaptureAudioPosition = true; AutoPropVar var; HRESULT hr = InitPropVariantFromInt64(UsecsToHNs(aTargetUs), &var); NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE); hr = mSourceReader->SetCurrentPosition(GUID_NULL, var); NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE); return DecodeToTarget(aTargetUs); }
nsresult DirectShowReader::Seek(int64_t aTargetUs, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) { HRESULT hr; MOZ_ASSERT(mDecoder->OnDecodeThread(), "Should be on decode thread.");\ LOG("DirectShowReader::Seek() target=%lld", aTargetUs); hr = mControl->Pause(); NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE); nsresult rv = ResetDecode(); NS_ENSURE_SUCCESS(rv, rv); LONGLONG seekPosition = UsecsToRefTime(aTargetUs); hr = mMediaSeeking->SetPositions(&seekPosition, AM_SEEKING_AbsolutePositioning, nullptr, AM_SEEKING_NoPositioning); NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE); hr = mControl->Run(); NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE); return DecodeToTarget(aTargetUs); }
nsresult WMFReader::Seek(int64_t aTargetUs, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) { LOG("WMFReader::Seek() %lld", aTargetUs); NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); if (!mCanSeek) { return NS_ERROR_FAILURE; } nsresult rv = ResetDecode(); NS_ENSURE_SUCCESS(rv, rv); AutoPropVar var; HRESULT hr = InitPropVariantFromInt64(UsecsToHNs(aTargetUs), &var); NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE); hr = mSourceReader->SetCurrentPosition(GUID_NULL, var); NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE); return DecodeToTarget(aTargetUs); }
nsresult MediaPluginReader::Seek(int64_t aTarget, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) { NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); mVideoQueue.Erase(); mAudioQueue.Erase(); mAudioSeekTimeUs = mVideoSeekTimeUs = aTarget; return DecodeToTarget(aTarget); }
nsresult MediaOmxReader::Seek(int64_t aTarget, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) { NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); ResetDecode(); VideoFrameContainer* container = mDecoder->GetVideoFrameContainer(); if (container && container->GetImageContainer()) { container->GetImageContainer()->ClearAllImagesExceptFront(); } mAudioSeekTimeUs = mVideoSeekTimeUs = aTarget; return DecodeToTarget(aTarget); }
nsresult GStreamerReader::Seek(int64_t aTarget, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) { NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); gint64 seekPos = aTarget * GST_USECOND; LOG(PR_LOG_DEBUG, ("%p About to seek to %" GST_TIME_FORMAT, mDecoder, GST_TIME_ARGS(seekPos))); if (!gst_element_seek_simple(mPlayBin, GST_FORMAT_TIME, static_cast<GstSeekFlags>(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE), seekPos)) { LOG(PR_LOG_ERROR, ("seek failed")); return NS_ERROR_FAILURE; } LOG(PR_LOG_DEBUG, ("seek succeeded")); return DecodeToTarget(aTarget); }
nsresult GStreamerReader::Seek(int64_t aTarget, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) { NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); gint64 seekPos = aTarget * GST_USECOND; LOG(PR_LOG_DEBUG, "%p About to seek to %" GST_TIME_FORMAT, mDecoder, GST_TIME_ARGS(seekPos)); if (!gst_element_seek_simple(mPlayBin, GST_FORMAT_TIME, static_cast<GstSeekFlags>(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE), seekPos)) { LOG(PR_LOG_ERROR, "seek failed"); return NS_ERROR_FAILURE; } LOG(PR_LOG_DEBUG, "seek succeeded"); GstMessage* message = gst_bus_timed_pop_filtered(mBus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR)); gst_message_unref(message); LOG(PR_LOG_DEBUG, "seek completed"); return DecodeToTarget(aTarget); }