libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
mpegtsfilemediaio.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <cstdint>
14#include <promeki/namespace.h>
15#include <promeki/buffer.h>
16#include <promeki/file.h>
17#include <promeki/frame.h>
18#include <promeki/framerate.h>
21#include <promeki/uniqueptr.h>
22
23PROMEKI_NAMESPACE_BEGIN
24
25class MpegTsFramer;
26
87class MpegTsFileMediaIO : public SharedThreadMediaIO {
88 PROMEKI_OBJECT(MpegTsFileMediaIO, SharedThreadMediaIO)
89 public:
91 static inline const MediaIOStats::ID StatsPacketsWritten{"PacketsWritten"};
92
94 static inline const MediaIOStats::ID StatsBytesWritten{"BytesWritten"};
95
97 static inline const MediaIOStats::ID StatsFramesWritten{"FramesWritten"};
98
100 static inline const MediaIOStats::ID StatsPacketsRead{"PacketsRead"};
101
103 static inline const MediaIOStats::ID StatsBytesRead{"BytesRead"};
104
106 static inline const MediaIOStats::ID StatsFramesRead{"FramesRead"};
107
109 static inline const MediaIOStats::ID StatsContinuityErrors{"ContinuityErrors"};
110
112 static inline const MediaIOStats::ID StatsBytesDiscarded{"BytesDiscarded"};
113
114 MpegTsFileMediaIO(ObjectBase *parent = nullptr);
115 ~MpegTsFileMediaIO() override;
116
117 Error describe(MediaIODescription *out) const override;
118 Error proposeInput(const MediaDesc &offered, MediaDesc *preferred) const override;
119
120 protected:
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;
126
127 private:
128 Error openSink(const MediaIOCommandOpen &cmd);
129 Error openSource(const MediaIOCommandOpen &cmd);
130 Error pumpReader();
131 void applyFramerConfig(const MediaIO::Config &cfg);
132
133 File _file;
134 String _filename;
135 bool _isWrite = false;
136 bool _isOpen = false;
137 bool _eof = false;
138
139 UniquePtr<MpegTsFramer> _framer;
140 Frame::List _readQueue;
141
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;
148};
149
154class MpegTsFileFactory : public MediaIOFactory {
155 public:
156 MpegTsFileFactory() = default;
157
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).");
163 }
164 StringList extensions() const override {
165 return {String("ts"), String("m2ts"), String("mts")};
166 }
167 bool canBeSink() const override { return true; }
168 bool canBeSource() const override { return true; }
169
170 Config::SpecMap configSpecs() const override;
171 MediaIO *create(const Config &config, ObjectBase *parent = nullptr) const override;
172};
173
174PROMEKI_NAMESPACE_END
175
176#endif // PROMEKI_ENABLE_PROAV