ImageDecoderAVFObjC.h [plain text]
#pragma once
#if HAVE(AVASSETREADER)
#include "ImageDecoder.h"
#include "SampleMap.h"
#include <wtf/Lock.h>
#include <wtf/Vector.h>
#include <wtf/text/WTFString.h>
OBJC_CLASS AVAssetTrack;
OBJC_CLASS AVAssetReader;
OBJC_CLASS AVURLAsset;
OBJC_CLASS WebCoreSharedBufferResourceLoaderDelegate;
typedef struct opaqueCMSampleBuffer* CMSampleBufferRef;
namespace WTF {
class MediaTime;
}
namespace WebCore {
class ContentType;
class ImageDecoderAVFObjCSample;
class ImageRotationSessionVT;
class PixelBufferConformerCV;
class WebCoreDecompressionSession;
class ImageDecoderAVFObjC : public ImageDecoder {
public:
static RefPtr<ImageDecoderAVFObjC> create(SharedBuffer&, const String& mimeType, AlphaOption, GammaAndColorProfileOption);
virtual ~ImageDecoderAVFObjC();
static bool supportsMediaType(MediaType);
static bool supportsContainerType(const String&);
size_t bytesDecodedToDetermineProperties() const override { return 0; }
static bool canDecodeType(const String& mimeType);
const String& mimeType() const { return m_mimeType; }
void setEncodedDataStatusChangeCallback(WTF::Function<void(EncodedDataStatus)>&&) final;
EncodedDataStatus encodedDataStatus() const final;
IntSize size() const final;
size_t frameCount() const final;
RepetitionCount repetitionCount() const final;
String uti() const final;
String filenameExtension() const final;
Optional<IntPoint> hotSpot() const final { return WTF::nullopt; }
IntSize frameSizeAtIndex(size_t, SubsamplingLevel = SubsamplingLevel::Default) const final;
bool frameIsCompleteAtIndex(size_t) const final;
ImageOrientation frameOrientationAtIndex(size_t) const final;
Seconds frameDurationAtIndex(size_t) const final;
bool frameHasAlphaAtIndex(size_t) const final;
bool frameAllowSubsamplingAtIndex(size_t) const final;
unsigned frameBytesAtIndex(size_t, SubsamplingLevel = SubsamplingLevel::Default) const final;
NativeImagePtr createFrameImageAtIndex(size_t, SubsamplingLevel = SubsamplingLevel::Default, const DecodingOptions& = DecodingOptions(DecodingMode::Synchronous)) final;
void setExpectedContentSize(long long) final;
void setData(SharedBuffer&, bool allDataReceived) final;
bool isAllDataReceived() const final { return m_isAllDataReceived; }
void clearFrameBufferCache(size_t) final;
private:
ImageDecoderAVFObjC(SharedBuffer&, const String& mimeType, AlphaOption, GammaAndColorProfileOption);
AVAssetTrack *firstEnabledTrack();
void readSamples();
void readTrackMetadata();
bool storeSampleBuffer(CMSampleBufferRef);
void advanceCursor();
void setTrack(AVAssetTrack *);
const ImageDecoderAVFObjCSample* sampleAtIndex(size_t) const;
bool sampleIsComplete(const ImageDecoderAVFObjCSample&) const;
String m_mimeType;
String m_uti;
RetainPtr<AVURLAsset> m_asset;
RetainPtr<AVAssetTrack> m_track;
RetainPtr<WebCoreSharedBufferResourceLoaderDelegate> m_loader;
std::unique_ptr<ImageRotationSessionVT> m_imageRotationSession;
Ref<WebCoreDecompressionSession> m_decompressionSession;
WTF::Function<void(EncodedDataStatus)> m_encodedDataStatusChangedCallback;
SampleMap m_sampleData;
DecodeOrderSampleMap::iterator m_cursor;
Lock m_sampleGeneratorLock;
bool m_isAllDataReceived { false };
Optional<IntSize> m_size;
};
}
#endif