11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
26PROMEKI_NAMESPACE_BEGIN
68class QuickTimeMediaIO :
public DedicatedThreadMediaIO {
69 PROMEKI_OBJECT(QuickTimeMediaIO, DedicatedThreadMediaIO)
72 static inline constexpr int DefaultFragmentFrames = 30;
75 QuickTimeMediaIO(ObjectBase *parent =
nullptr);
78 ~QuickTimeMediaIO()
override;
80 Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const override;
83 Error executeCmd(MediaIOCommandOpen &cmd)
override;
84 Error executeCmd(MediaIOCommandClose &cmd)
override;
85 Error executeCmd(MediaIOCommandRead &cmd)
override;
86 Error executeCmd(MediaIOCommandWrite &cmd)
override;
87 Error executeCmd(MediaIOCommandSeek &cmd)
override;
94 static bool isSupportedPixelFormat(
const PixelFormat &pd);
100 static PixelFormat pickSupportedPixelFormat(
const PixelFormat &offered);
102 Error readVideoFrame(
const FrameNumber &frameIndex, Frame &outFrame);
103 Error readAudioSlice(uint64_t startSample,
size_t samples, MediaPayload::Ptr &out);
104 Error setupWriterFromFrame(
const Frame &frame);
105 Error drainWriterAudio(
bool flush);
108 bool _isOpen =
false;
109 bool _isWrite =
false;
111 int _videoTrackIndex = -1;
112 int _audioTrackIndex = -1;
113 FrameNumber _currentFrame{0};
114 FrameCount _frameCount{0};
115 FrameRate _frameRate;
116 Timecode _anchorTimecode;
117 uint64_t _audioSampleCursor = 0;
118 AudioDesc _audioDesc;
120 bool _writerTracksRegistered =
false;
121 uint32_t _writerVideoTrackId = 0;
122 uint32_t _writerAudioTrackId = 0;
123 uint32_t _writerTimecodeTrackId = 0;
124 FrameCount _writerFrameCount{0};
125 int _writerFragmentFrames = DefaultFragmentFrames;
126 FrameCount _writerFramesSinceFlush{0};
127 AudioBuffer _writerAudioFifo;
128 AudioDesc _writerAudioStorage;
135class QuickTimeFactory :
public MediaIOFactory {
137 QuickTimeFactory() =
default;
139 String name()
const override {
return String(
"QuickTime"); }
140 String displayName()
const override {
return String(
"QuickTime / MOV"); }
141 String description()
const override {
142 return String(
"QuickTime / ISO-BMFF container files (.mov, .mp4, .m4v)");
144 StringList extensions()
const override {
145 return {String(
"mov"), String(
"qt"), String(
"mp4"), String(
"m4v")};
148 bool canBeSource()
const override {
return true; }
149 bool canBeSink()
const override {
return true; }
151 bool canHandleDevice(IODevice *device)
const override;
152 Config::SpecMap configSpecs()
const override;
153 Metadata defaultMetadata()
const override;
155 MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const override;