// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreTypes.h" #include "IMediaSamples.h" #include "IMediaTextureSample.h" #include "IMediaTimeSource.h" #include "MediaSampleQueue.h" #include "Templates/SharedPointer.h" class IMediaAudioSample; class IMediaBinarySample; class IMediaOverlaySample; class IMediaTextureSample; struct FTimespan; template class TRange; /** * General purpose media sample queue. */ class FMediaSamples : public IMediaSamples { public: static constexpr uint32 MaxNumberOfQueuedVideoSamples = 4; static constexpr uint32 MaxNumberOfQueuedAudioSamples = 4; static constexpr uint32 MaxNumberOfQueuedCaptionSamples = 4; static constexpr uint32 MaxNumberOfQueuedSubtitlesSamples = 4; static constexpr uint32 MaxNumberOfQueuedMetaDataSamples = 4; MEDIAUTILS_API FMediaSamples(uint32 InMaxNumberOfQueuedAudioSamples = MaxNumberOfQueuedAudioSamples, uint32 InMaxNumberOfQueuedVideoSamples = MaxNumberOfQueuedVideoSamples, uint32 InMaxNumberOfQueuedCaptionSamples = MaxNumberOfQueuedCaptionSamples, uint32 InMaxNumberOfQueuedSubtitlesSamples = MaxNumberOfQueuedSubtitlesSamples, uint32 InMaxNumberOfQueuedMetaDataSamples = MaxNumberOfQueuedMetaDataSamples); MEDIAUTILS_API ~FMediaSamples(); /** * Add the given audio sample to the cache. * * @param Sample The sample to add. * @see AddCaption, AddMetadata, AddSubtitle, AddVideo, NumAudio */ MEDIAUTILS_API void AddAudio(const TSharedRef& Sample); /** * Add the given caption sample to the cache. * * @param Sample The sample to add. * @see AddAudio, AddMetadata, AddSubtitle, AddVideo, NumCaption */ MEDIAUTILS_API void AddCaption(const TSharedRef& Sample); /** * Add the given audio sample to the cache. * * @param Sample The sample to add. * @see AddAudio, AddCaption, AddSubtitle, AddVideo, NumMetadata */ MEDIAUTILS_API void AddMetadata(const TSharedRef& Sample); /** * Add the given subtitle sample to the cache. * * @param Sample The sample to add. * @see AddAudio, AddCaption, AddMetadata, AddVideo, NumSubtitle */ MEDIAUTILS_API void AddSubtitle(const TSharedRef& Sample); /** * Add the given audio sample to the cache. * * @param Sample The sample to add. * @see AddAudio, AddCaption, AddMetadata, AddSubtitle, NumVideo */ MEDIAUTILS_API void AddVideo(const TSharedRef& Sample); /** * Get the number of queued audio samples. * * @return Number of samples. * @see AddAudio, NumCaption, NumMetadata, NumSubtitle, NumVideo */ int32 NumAudioSamples() const override { return AudioSampleQueue.Num(); } /** * Get the number of queued caption samples. * * @return Number of samples. * @see AddCaption, NumAudio, NumMetadata, NumSubtitle, NumVideo */ int32 NumCaptionSamples() const override { return CaptionSampleQueue.Num(); } /** * Get the number of queued metadata samples. * * @return Number of samples. * @see AddMetadata, NumAudio, NumCaption, NumSubtitle, NumVideo */ int32 NumMetadataSamples() const override { return MetadataSampleQueue.Num(); } /** * Get the number of queued subtitle samples. * * @return Number of samples. * @see AddSubtitle, NumAudio, NumCaption, NumMetadata, NumVideo */ int32 NumSubtitleSamples() const override { return SubtitleSampleQueue.Num(); } /** * Get the number of queued video samples. * * @return Number of samples. * @see AddVideo, NumAudio, NumCaption, NumMetadata, NumSubtitle */ int32 NumVideoSamples() const override { return VideoSampleQueue.Num(); } public: //~ IMediaSamples interface MEDIAUTILS_API virtual bool FetchAudio(TRange TimeRange, TSharedPtr& OutSample) override; MEDIAUTILS_API virtual bool FetchCaption(TRange TimeRange, TSharedPtr& OutSample) override; MEDIAUTILS_API virtual bool FetchMetadata(TRange TimeRange, TSharedPtr& OutSample) override; MEDIAUTILS_API virtual bool FetchSubtitle(TRange TimeRange, TSharedPtr& OutSample) override; MEDIAUTILS_API virtual bool FetchVideo(TRange TimeRange, TSharedPtr& OutSample) override; MEDIAUTILS_API virtual void FlushSamples() override; MEDIAUTILS_API virtual bool FetchAudio(TRange TimeRange, TSharedPtr& OutSample) override; MEDIAUTILS_API virtual bool FetchCaption(TRange TimeRange, TSharedPtr& OutSample) override; MEDIAUTILS_API virtual bool FetchMetadata(TRange TimeRange, TSharedPtr& OutSample) override; MEDIAUTILS_API virtual bool FetchSubtitle(TRange TimeRange, TSharedPtr& OutSample) override; MEDIAUTILS_API virtual bool FetchVideo(TRange TimeRange, TSharedPtr& OutSample) override; MEDIAUTILS_API virtual EFetchBestSampleResult FetchBestVideoSampleForTimeRange(const TRange& TimeRange, TSharedPtr& OutSample, bool bReverse, bool bConsistentResult) override; MEDIAUTILS_API virtual void SetMinExpectedNextSequenceIndex(TOptional InNextSequenceIndex) override; /** * Peek next video sample's timestamp * @return true if value could be retrieved, false otherwise */ virtual bool PeekVideoSampleTime(FMediaTimeStamp & TimeStamp) override { TSharedPtr Sample; if (!VideoSampleQueue.Peek(Sample)) { return false; } TimeStamp = Sample->GetTime(); return true; } virtual bool PeekVideoSampleTimeRanges(TArray>& TimeRange) override { VideoSampleQueue.GetSampleTimes(TimeRange); return TimeRange.Num() > 0; } virtual bool PeekAudioSampleTimeRanges(TArray>& TimeRange) override { AudioSampleQueue.GetSampleTimes(TimeRange); return TimeRange.Num() > 0; } virtual bool DiscardVideoSamples(const TRange& TimeRange, bool bReverse) override { return VideoSampleQueue.Discard(TimeRange, bReverse); } virtual bool DiscardAudioSamples(const TRange& TimeRange, bool bReverse) override { return AudioSampleQueue.Discard(TimeRange, bReverse); } virtual bool DiscardCaptionSamples(const TRange& TimeRange, bool bReverse) override { return CaptionSampleQueue.Discard(TimeRange, bReverse); } virtual bool DiscardSubtitleSamples(const TRange& TimeRange, bool bReverse) override { return SubtitleSampleQueue.Discard(TimeRange, bReverse); } virtual bool DiscardMetadataSamples(const TRange& TimeRange, bool bReverse) override { return MetadataSampleQueue.Discard(TimeRange, bReverse); } MEDIAUTILS_API virtual uint32 PurgeOutdatedVideoSamples(const FMediaTimeStamp & ReferenceTime, bool bReversed, FTimespan MaxAge) override; MEDIAUTILS_API virtual uint32 PurgeOutdatedSubtitleSamples(const FMediaTimeStamp & ReferenceTime, bool bReversed, FTimespan MaxAge) override; MEDIAUTILS_API virtual uint32 PurgeOutdatedCaptionSamples(const FMediaTimeStamp& ReferenceTime, bool bReversed, FTimespan MaxAge) override; MEDIAUTILS_API virtual uint32 PurgeOutdatedMetadataSamples(const FMediaTimeStamp& ReferenceTime, bool bReversed, FTimespan MaxAge) override; MEDIAUTILS_API virtual bool CanReceiveVideoSamples(uint32 Num) const override; MEDIAUTILS_API virtual bool CanReceiveAudioSamples(uint32 Num) const override; MEDIAUTILS_API virtual bool CanReceiveSubtitleSamples(uint32 Num) const override; MEDIAUTILS_API virtual bool CanReceiveCaptionSamples(uint32 Num) const override; MEDIAUTILS_API virtual bool CanReceiveMetadataSamples(uint32 Num) const override; private: /** Audio sample queue. */ FMediaAudioSampleQueue AudioSampleQueue; /** Caption sample queue. */ FMediaOverlaySampleQueue CaptionSampleQueue; /** Metadata sample queue. */ FMediaBinarySampleQueue MetadataSampleQueue; /** Subtitle sample queue. */ FMediaOverlaySampleQueue SubtitleSampleQueue; /** Video sample queue. */ FMediaTextureSampleQueue VideoSampleQueue; /** The next smallest expected sequence index if set. */ TOptional NextMinSequenceIndex; };