11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV && PROMEKI_ENABLE_FFMPEG
26struct AVFormatContext;
31PROMEKI_NAMESPACE_BEGIN
101class FfmpegMediaIO :
public DedicatedThreadMediaIO {
102 PROMEKI_OBJECT(FfmpegMediaIO, DedicatedThreadMediaIO)
105 FfmpegMediaIO(ObjectBase *parent =
nullptr);
108 ~FfmpegMediaIO()
override;
110 Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const override;
113 Error executeCmd(MediaIOCommandOpen &cmd)
override;
114 Error executeCmd(MediaIOCommandClose &cmd)
override;
115 Error executeCmd(MediaIOCommandRead &cmd)
override;
116 Error executeCmd(MediaIOCommandWrite &cmd)
override;
117 Error executeCmd(MediaIOCommandSeek &cmd)
override;
120 Error openReader(
const MediaIOCommandOpen &cmd, MediaIOCommandOpen &out);
121 Error openWriter(
const MediaIOCommandOpen &cmd, MediaIOCommandOpen &out);
122 Error setupWriterFromFrame(
const Frame &frame);
123 void closeContexts();
129 void rewriteVideoForCodec(MediaDesc &desc)
const;
130 void rewriteAudioForCodec(MediaDesc &desc)
const;
133 bool _isOpen =
false;
134 bool _isWrite =
false;
138 AVFormatContext *_inFmt =
nullptr;
139 AVBSFContext *_bsf =
nullptr;
140 int _videoStream = -1;
141 int _audioStream = -1;
142 FrameRate _frameRate;
143 FrameCount _frameCount{FrameCount::unknown()};
144 FrameNumber _currentFrame{0};
145 AudioDesc _audioDesc;
149 AVFormatContext *_outFmt =
nullptr;
150 AVStream *_outVideo =
nullptr;
151 AVStream *_outAudio =
nullptr;
152 bool _headerWritten =
false;
153 bool _writerTracksRegistered =
false;
154 int64_t _writerVideoPts = 0;
155 int64_t _writerAudioPts = 0;
165class FfmpegFactory :
public MediaIOFactory {
167 FfmpegFactory() =
default;
169 String name()
const override {
return String(
"FFmpeg"); }
170 String displayName()
const override {
return String(
"FFmpeg (libavformat)"); }
171 String description()
const override {
172 return String(
"Generic FFmpeg container backend (Matroska/WebM, AVI, FLV, …)");
180 StringList extensions()
const override {
181 return {String(
"mkv"), String(
"webm"), String(
"avi"), String(
"flv"),
182 String(
"wmv"), String(
"asf"), String(
"ogv"), String(
"ogg"),
183 String(
"mpg"), String(
"mpeg"), String(
"vob"), String(
"3gp"),
184 String(
"rm"), String(
"rmvb"), String(
"nut"), String(
"mxf")};
187 bool canBeSource()
const override {
return true; }
188 bool canBeSink()
const override {
return true; }
189 bool isFallback()
const override {
return true; }
191 bool canHandleDevice(IODevice *device)
const override;
192 Config::SpecMap configSpecs()
const override;
194 MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const override;