#ifndef MediaSample_h
#define MediaSample_h
#include "FloatSize.h"
#include <JavaScriptCore/TypedArrays.h>
#include <wtf/EnumTraits.h>
#include <wtf/MediaTime.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/text/AtomString.h>
typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
typedef struct _GstSample GstSample;
typedef struct OpaqueMTPluginByteSource *MTPluginByteSourceRef;
typedef const struct opaqueCMFormatDescription *CMFormatDescriptionRef;
namespace WebCore {
class MockSampleBox;
struct PlatformSample {
enum {
None,
MockSampleBoxType,
CMSampleBufferType,
GStreamerSampleType,
ByteRangeSampleType,
} type;
union {
MockSampleBox* mockSampleBox;
CMSampleBufferRef cmSampleBuffer;
GstSample* gstSample;
std::pair<MTPluginByteSourceRef, CMFormatDescriptionRef> byteRangeSample;
} sample;
};
class WEBCORE_EXPORT MediaSample : public ThreadSafeRefCounted<MediaSample> {
public:
virtual ~MediaSample() = default;
virtual MediaTime presentationTime() const = 0;
virtual MediaTime decodeTime() const = 0;
virtual MediaTime duration() const = 0;
virtual AtomString trackID() const = 0;
virtual void setTrackID(const String&) = 0;
virtual size_t sizeInBytes() const = 0;
virtual FloatSize presentationSize() const = 0;
virtual void offsetTimestampsBy(const MediaTime&) = 0;
virtual void setTimestamps(const MediaTime&, const MediaTime&) = 0;
virtual bool isDivisable() const = 0;
enum DivideFlags { BeforePresentationTime, AfterPresentationTime };
virtual std::pair<RefPtr<MediaSample>, RefPtr<MediaSample>> divide(const MediaTime& presentationTime) = 0;
virtual Ref<MediaSample> createNonDisplayingCopy() const = 0;
virtual RefPtr<JSC::Uint8ClampedArray> getRGBAImageData() const { return nullptr; }
enum SampleFlags {
None = 0,
IsSync = 1 << 0,
IsNonDisplaying = 1 << 1,
HasAlpha = 1 << 2,
HasSyncInfo = 1 << 3,
};
virtual SampleFlags flags() const = 0;
virtual PlatformSample platformSample() = 0;
struct ByteRange {
size_t byteOffset { 0 };
size_t byteLength { 0 };
};
virtual Optional<ByteRange> byteRange() const = 0;
enum class VideoRotation {
None = 0,
UpsideDown = 180,
Right = 90,
Left = 270,
};
virtual VideoRotation videoRotation() const { return VideoRotation::None; }
virtual bool videoMirrored() const { return false; }
virtual uint32_t videoPixelFormat() const { return 0; }
bool isSync() const { return flags() & IsSync; }
bool isNonDisplaying() const { return flags() & IsNonDisplaying; }
bool hasAlpha() const { return flags() & HasAlpha; }
bool hasSyncInfo() const { return flags() & HasSyncInfo; }
virtual void dump(PrintStream&) const = 0;
String toJSONString() const
{
auto object = JSON::Object::create();
object->setObject("pts"_s, presentationTime().toJSONObject());
object->setObject("dts"_s, decodeTime().toJSONObject());
object->setObject("duration"_s, duration().toJSONObject());
object->setInteger("flags"_s, static_cast<unsigned>(flags()));
object->setObject("presentationSize"_s, presentationSize().toJSONObject());
return object->toJSONString();
}
};
}
namespace WTF {
template<> struct EnumTraits<WebCore::MediaSample::VideoRotation> {
using values = EnumValues<
WebCore::MediaSample::VideoRotation,
WebCore::MediaSample::VideoRotation::None,
WebCore::MediaSample::VideoRotation::UpsideDown,
WebCore::MediaSample::VideoRotation::Right,
WebCore::MediaSample::VideoRotation::Left
>;
};
template<typename Type> struct LogArgument;
template <>
struct LogArgument<WebCore::MediaSample> {
static String toString(const WebCore::MediaSample& sample)
{
return sample.toJSONString();
}
};
}
#endif