Files
UnrealEngine/Engine/Source/Runtime/MediaUtils/Public/MediaSamples.h
2025-05-18 13:04:45 +08:00

239 lines
8.5 KiB
C++

// 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 <typename ElementType> 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<IMediaAudioSample, ESPMode::ThreadSafe>& 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<IMediaOverlaySample, ESPMode::ThreadSafe>& 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<IMediaBinarySample, ESPMode::ThreadSafe>& 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<IMediaOverlaySample, ESPMode::ThreadSafe>& 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<IMediaTextureSample, ESPMode::ThreadSafe>& 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<FTimespan> TimeRange, TSharedPtr<IMediaAudioSample, ESPMode::ThreadSafe>& OutSample) override;
MEDIAUTILS_API virtual bool FetchCaption(TRange<FTimespan> TimeRange, TSharedPtr<IMediaOverlaySample, ESPMode::ThreadSafe>& OutSample) override;
MEDIAUTILS_API virtual bool FetchMetadata(TRange<FTimespan> TimeRange, TSharedPtr<IMediaBinarySample, ESPMode::ThreadSafe>& OutSample) override;
MEDIAUTILS_API virtual bool FetchSubtitle(TRange<FTimespan> TimeRange, TSharedPtr<IMediaOverlaySample, ESPMode::ThreadSafe>& OutSample) override;
MEDIAUTILS_API virtual bool FetchVideo(TRange<FTimespan> TimeRange, TSharedPtr<IMediaTextureSample, ESPMode::ThreadSafe>& OutSample) override;
MEDIAUTILS_API virtual void FlushSamples() override;
MEDIAUTILS_API virtual bool FetchAudio(TRange<FMediaTimeStamp> TimeRange, TSharedPtr<IMediaAudioSample, ESPMode::ThreadSafe>& OutSample) override;
MEDIAUTILS_API virtual bool FetchCaption(TRange<FMediaTimeStamp> TimeRange, TSharedPtr<IMediaOverlaySample, ESPMode::ThreadSafe>& OutSample) override;
MEDIAUTILS_API virtual bool FetchMetadata(TRange<FMediaTimeStamp> TimeRange, TSharedPtr<IMediaBinarySample, ESPMode::ThreadSafe>& OutSample) override;
MEDIAUTILS_API virtual bool FetchSubtitle(TRange<FMediaTimeStamp> TimeRange, TSharedPtr<IMediaOverlaySample, ESPMode::ThreadSafe>& OutSample) override;
MEDIAUTILS_API virtual bool FetchVideo(TRange<FMediaTimeStamp> TimeRange, TSharedPtr<IMediaTextureSample, ESPMode::ThreadSafe>& OutSample) override;
MEDIAUTILS_API virtual EFetchBestSampleResult FetchBestVideoSampleForTimeRange(const TRange<FMediaTimeStamp>& TimeRange, TSharedPtr<IMediaTextureSample, ESPMode::ThreadSafe>& OutSample, bool bReverse, bool bConsistentResult) override;
MEDIAUTILS_API virtual void SetMinExpectedNextSequenceIndex(TOptional<int32> InNextSequenceIndex) override;
/**
* Peek next video sample's timestamp
* @return true if value could be retrieved, false otherwise
*/
virtual bool PeekVideoSampleTime(FMediaTimeStamp & TimeStamp) override
{
TSharedPtr<IMediaTextureSample, ESPMode::ThreadSafe> Sample;
if (!VideoSampleQueue.Peek(Sample))
{
return false;
}
TimeStamp = Sample->GetTime();
return true;
}
virtual bool PeekVideoSampleTimeRanges(TArray<TRange<FMediaTimeStamp>>& TimeRange) override
{
VideoSampleQueue.GetSampleTimes(TimeRange);
return TimeRange.Num() > 0;
}
virtual bool PeekAudioSampleTimeRanges(TArray<TRange<FMediaTimeStamp>>& TimeRange) override
{
AudioSampleQueue.GetSampleTimes(TimeRange);
return TimeRange.Num() > 0;
}
virtual bool DiscardVideoSamples(const TRange<FMediaTimeStamp>& TimeRange, bool bReverse) override
{
return VideoSampleQueue.Discard(TimeRange, bReverse);
}
virtual bool DiscardAudioSamples(const TRange<FMediaTimeStamp>& TimeRange, bool bReverse) override
{
return AudioSampleQueue.Discard(TimeRange, bReverse);
}
virtual bool DiscardCaptionSamples(const TRange<FMediaTimeStamp>& TimeRange, bool bReverse) override
{
return CaptionSampleQueue.Discard(TimeRange, bReverse);
}
virtual bool DiscardSubtitleSamples(const TRange<FMediaTimeStamp>& TimeRange, bool bReverse) override
{
return SubtitleSampleQueue.Discard(TimeRange, bReverse);
}
virtual bool DiscardMetadataSamples(const TRange<FMediaTimeStamp>& 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<int32> NextMinSequenceIndex;
};