11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
23PROMEKI_NAMESPACE_BEGIN
87class MpegTsFileMediaIO :
public SharedThreadMediaIO {
88 PROMEKI_OBJECT(MpegTsFileMediaIO, SharedThreadMediaIO)
91 static inline const MediaIOStats::ID StatsPacketsWritten{
"PacketsWritten"};
94 static inline const MediaIOStats::ID StatsBytesWritten{
"BytesWritten"};
97 static inline const MediaIOStats::ID StatsFramesWritten{
"FramesWritten"};
100 static inline const MediaIOStats::ID StatsPacketsRead{
"PacketsRead"};
103 static inline const MediaIOStats::ID StatsBytesRead{
"BytesRead"};
106 static inline const MediaIOStats::ID StatsFramesRead{
"FramesRead"};
109 static inline const MediaIOStats::ID StatsContinuityErrors{
"ContinuityErrors"};
112 static inline const MediaIOStats::ID StatsBytesDiscarded{
"BytesDiscarded"};
114 MpegTsFileMediaIO(ObjectBase *parent =
nullptr);
115 ~MpegTsFileMediaIO()
override;
117 Error describe(MediaIODescription *out)
const override;
118 Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const override;
121 Error executeCmd(MediaIOCommandOpen &cmd)
override;
122 Error executeCmd(MediaIOCommandClose &cmd)
override;
123 Error executeCmd(MediaIOCommandWrite &cmd)
override;
124 Error executeCmd(MediaIOCommandRead &cmd)
override;
125 Error executeCmd(MediaIOCommandStats &cmd)
override;
128 Error openSink(
const MediaIOCommandOpen &cmd);
129 Error openSource(
const MediaIOCommandOpen &cmd);
131 void applyFramerConfig(
const MediaIO::Config &cfg);
135 bool _isWrite =
false;
136 bool _isOpen =
false;
139 UniquePtr<MpegTsFramer> _framer;
140 Frame::List _readQueue;
142 int64_t _packetsWritten = 0;
143 int64_t _bytesWritten = 0;
144 int64_t _framesWritten = 0;
145 int64_t _packetsRead = 0;
146 int64_t _bytesRead = 0;
147 int64_t _framesRead = 0;
154class MpegTsFileFactory :
public MediaIOFactory {
156 MpegTsFileFactory() =
default;
158 String name()
const override {
return String(
"MpegTsFile"); }
159 String displayName()
const override {
return String(
"MPEG-2 TS file"); }
160 String description()
const override {
161 return String(
"MPEG-2 Transport Stream file read / write "
162 "backend (H.264 / HEVC + AAC).");
164 StringList extensions()
const override {
165 return {String(
"ts"), String(
"m2ts"), String(
"mts")};
167 bool canBeSink()
const override {
return true; }
168 bool canBeSource()
const override {
return true; }
170 Config::SpecMap configSpecs()
const override;
171 MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const override;