MythTV master
mpeg2fix.h
Go to the documentation of this file.
1// POSIX
2#include <pthread.h>
3
4// C++
5#include <cstdlib>
6
7extern "C"
8{
9//AVFormat/AVCodec
10#include "libavcodec/avcodec.h"
11#include "libavformat/avformat.h"
12
13#include "libmythbase/mythconfig.h"
14//libmpeg2
15#if CONFIG_LIBMPEG2EXTERNAL
16#include <mpeg2dec/mpeg2.h>
17#else
18#include "libmythmpeg2/mpeg2.h"
19#endif
20}
21
22//replex
25
26// Qt
27#include <QMap>
28#include <QList>
29#include <QQueue>
30#include <QStringList>
31#include <QDateTime>
32
33// MythTV
36
37// MythTranscode
38#include "transcodedefs.h"
39
40enum MPFListType : std::uint8_t {
43};
44
46{
47 public:
48 explicit MPEG2frame(int size);
50 void ensure_size(int size) const;
51 void set_pkt(AVPacket *newpkt) const;
52
53 AVPacket *m_pkt {nullptr};
54 bool m_isSequence {false};
55 bool m_isGop {false};
56 uint8_t *m_framePos {nullptr};
57 uint8_t *m_gopPos {nullptr};
58 mpeg2_sequence_t m_mpeg2_seq;
59 mpeg2_gop_t m_mpeg2_gop;
60 mpeg2_picture_t m_mpeg2_pic;
61};
62
63struct poq_idx_t {
64 int64_t newPTS;
65 int64_t pos_pts;
67 bool type;
68};
69
71{
72 public:
73 PTSOffsetQueue(int vidid, QList<int> keys, int64_t initPTS);
74 void SetNextPTS(int64_t newPTS, int64_t atPTS);
75 void SetNextPos(int64_t newPTS, AVPacket *pkt);
76 int64_t Get(int idx, AVPacket *pkt);
77 int64_t UpdateOrigPTS(int idx, int64_t &origPTS, AVPacket *pkt);
78 private:
79 QMap<int, QList<poq_idx_t> > m_offset;
80 QMap<int, QList<poq_idx_t> > m_orig;
81 QList<int> m_keyList;
83};
84
85//container for all multiplex related variables
86using RingbufferArray = std::array<ringbuffer,N_AUDIO>;
87using ExtTypeIntArray = std::array<int,N_AUDIO>;
88using AudioFrameArray = std::array<audio_frame_t,N_AUDIO>;
89
91{
92 public:
93 MPEG2replex() = default;
95 void Start();
96 int WaitBuffers();
97 int m_done {0};
98 QString m_outfile;
99 int m_otype {0};
104 int m_extCount {0};
107
108 pthread_mutex_t m_mutex {};
109 pthread_cond_t m_cond {};
112
113 private:
115};
116
117using FrameList = QList<MPEG2frame *>;
118using FrameQueue = QQueue<MPEG2frame *>;
119using FrameMap = QMap<int, FrameList *>;
120
122{
123 public:
124 MPEG2fixup(const QString &inf, const QString &outf,
125 frm_dir_map_t *deleteMap, const char *fmt, bool norp,
126 bool fixPTS, int maxf, bool showprog, int otype,
127 void (*update_func)(float) = nullptr, int (*check_func)() = nullptr);
128 ~MPEG2fixup();
129 int Start();
130 void AddRangeList(const QStringList& rangelist, int type);
131 static void ShowRangeMap(frm_dir_map_t *mapPtr, QString msg);
132 int BuildKeyframeIndex(const QString &file, frm_pos_map_t &posMap, frm_pos_map_t &durMap);
133
134 void SetAllAudio(bool keep) { m_allAudio = keep; }
135
136 static void dec2x33(int64_t *pts1, int64_t pts2);
137 static void inc2x33(int64_t *pts1, int64_t pts2);
138 static int64_t udiff2x33(int64_t pts1, int64_t pts2);
139 static int64_t diff2x33(int64_t pts1, int64_t pts2);
140 static int64_t add2x33(int64_t pts1, int64_t pts2);
141 static int cmp2x33(int64_t pts1, int64_t pts2);
142
143 protected:
144 static void *ReplexStart(void *data);
146
147 private:
148 static int FindMPEG2Header(const uint8_t *buf, int size, uint8_t code);
149 void InitReplex();
150 void FrameInfo(MPEG2frame *f);
151 int AddFrame(MPEG2frame *f);
152 bool InitAV(const QString& inputfile, const char *type, int64_t offset);
153 void ScanAudio();
154 int ProcessVideo(MPEG2frame *vf, mpeg2dec_t *dec);
155 void WriteFrame(const QString& filename, MPEG2frame *f);
156 void WriteFrame(const QString& filename, AVPacket *pkt);
157 static void WriteYUV(const QString& filename, const mpeg2_info_t *info);
158 static void WriteData(const QString& filename, uint8_t *data, int size);
159 bool BuildFrame(AVPacket *pkt, const QString& fname);
160 MPEG2frame *GetPoolFrame(AVPacket *pkt);
162 int GetFrame(AVPacket *pkt);
163 bool FindStart();
164 static void SetRepeat(MPEG2frame *vf, int nb_fields, bool topff);
165 static void SetRepeat(uint8_t *ptr, int size, int fields, bool topff);
166 MPEG2frame *FindFrameNum(int frameNum);
167 void RenumberFrames(int start_pos, int delta);
168 void StoreSecondary();
169 int PlaybackSecondary();
170 MPEG2frame *DecodeToFrame(int frameNum, int skip_reset);
171 int ConvertToI(FrameList *orderedFrames, int headPos);
172 int InsertFrame(int frameNum, int64_t deltaPTS,
173 int64_t ptsIncrement, int64_t initPTS);
174 void AddSequence(MPEG2frame *frame1, MPEG2frame *frame2);
175 static FrameList ReorderDTStoPTS(FrameList *dtsOrder, int pos);
176 void InitialPTSFixup(MPEG2frame *curFrame, int64_t &origvPTS,
177 int64_t &PTSdiscrep, int numframes, bool fix) const;
178 static void SetFrameNum(uint8_t *ptr, int num);
179 static int GetFrameNum(const MPEG2frame *frame)
180 {
181 return frame->m_mpeg2_pic.temporal_reference;
182 }
183 static int GetFrameTypeN(const MPEG2frame *frame)
184 {
185 return frame->m_mpeg2_pic.flags & PIC_MASK_CODING_TYPE;
186 }
187 static char GetFrameTypeT(const MPEG2frame *frame)
188 {
189 int type = GetFrameTypeN(frame);
190 if (type == 1)
191 return 'I';
192 if (type == 2)
193 return 'P';
194 if (type == 3)
195 return 'B';
196 return 'X';
197 }
198 static int GetNbFields(const MPEG2frame *frame)
199 {
200 return frame->m_mpeg2_pic.nb_fields;
201 }
202 int GetStreamType(int id) const
203 {
204 return (m_inputFC->streams[id]->codecpar->codec_id == AV_CODEC_ID_AC3) ?
205 AV_CODEC_ID_AC3 : AV_CODEC_ID_MP2;
206 }
207 AVCodecContext *getCodecContext(uint id)
208 {
209 if (id >= m_inputFC->nb_streams)
210 return nullptr;
211 return m_codecMap.GetCodecContext(m_inputFC->streams[id]);
212 }
213 AVCodecParserContext *getCodecParserContext(uint id)
214 {
215 if (id >= m_inputFC->nb_streams)
216 return nullptr;
217 return av_stream_get_parser(m_inputFC->streams[id]);
218 }
219
220 static void dumpList(FrameList *list);
221
222 int (*m_checkAbort)() {nullptr};
223 void (*m_updateStatus)(float percent_done) {nullptr};
224
226 bool m_useSecondary {false};
227
233 mpeg2dec_t *m_headerDecoder {nullptr};
234 mpeg2dec_t *m_imgDecoder {nullptr};
235
238
239 pthread_t m_thread {};
240
242 AVFormatContext *m_inputFC {nullptr};
243 AVFrame *m_picture {nullptr};
244
245 int m_vidId {-1};
246 int m_extCount {0};
247 QMap <int, int> m_audMap;
248 int64_t m_ptsIncrement {0};
249 bool m_mkvFile {false};
250
251 bool m_discard {false};
252 //control options
256 QString m_infile;
257 const char *m_format {nullptr};
258 bool m_allAudio {false};
259
260 //complete?
261 bool m_fileEnd {false};
262 bool m_realFileEnd {false};
263
264 //progress indicators
265 QDateTime m_statusTime;
266 bool m_showProgress {false};
267 uint64_t m_fileSize {0};
268 int m_frameNum {0};
270 uint64_t m_lastWrittenPos {0};
271};
272
273#ifdef NO_MYTH
274 #include <QDateTime>
275 #include <iostream>
276
277 extern int verboseMask;
278 #undef LOG
279 #define LOG(mask,level,args...) \
280 do { \
281 if ((verboseMask & mask) != 0) \
282 { \
283 cout << args << endl; \
284 } \
285 } while (0)
286
287 // Be sure to keep these the same as in libmythbase/exitcodes.h or expect
288 // odd behavior eventually
289 #define GENERIC_EXIT_OK 0
290 #define GENERIC_EXIT_NOT_OK 128
291 #define GENERIC_EXIT_WRITE_FRAME_ERROR 149
292 #define GENERIC_EXIT_DEADLOCK 150
293#else
294 #include "libmythbase/exitcodes.h"
295#endif
296
297/*
298 * vim:ts=4:sw=4:ai:et:si:sts=4
299 */
AVFrame AVFrame
bool InitAV(const QString &inputfile, const char *type, int64_t offset)
Definition: mpeg2fix.cpp:775
bool BuildFrame(AVPacket *pkt, const QString &fname)
Definition: mpeg2fix.cpp:1129
MPEG2frame * DecodeToFrame(int frameNum, int skip_reset)
Definition: mpeg2fix.cpp:1726
QString m_infile
Definition: mpeg2fix.h:256
static int GetFrameNum(const MPEG2frame *frame)
Definition: mpeg2fix.h:179
void AddSequence(MPEG2frame *frame1, MPEG2frame *frame2)
Definition: mpeg2fix.cpp:870
bool m_fileEnd
Definition: mpeg2fix.h:261
QMap< int, int > m_audMap
Definition: mpeg2fix.h:247
void RenumberFrames(int start_pos, int delta)
Definition: mpeg2fix.cpp:1685
bool m_allAudio
Definition: mpeg2fix.h:258
static void SetRepeat(MPEG2frame *vf, int nb_fields, bool topff)
Definition: mpeg2fix.cpp:1637
MPEG2replex m_rx
Definition: mpeg2fix.h:145
static void WriteYUV(const QString &filename, const mpeg2_info_t *info)
Definition: mpeg2fix.cpp:1067
static int64_t diff2x33(int64_t pts1, int64_t pts2)
Definition: mpeg2fix.cpp:380
QDateTime m_statusTime
Definition: mpeg2fix.h:265
pthread_t m_thread
Definition: mpeg2fix.h:239
void WriteFrame(const QString &filename, MPEG2frame *f)
Definition: mpeg2fix.cpp:1021
bool m_discard
Definition: mpeg2fix.h:251
static int GetNbFields(const MPEG2frame *frame)
Definition: mpeg2fix.h:198
void ScanAudio()
static FrameList ReorderDTStoPTS(FrameList *dtsOrder, int pos)
Definition: mpeg2fix.cpp:2016
static char GetFrameTypeT(const MPEG2frame *frame)
Definition: mpeg2fix.h:187
uint64_t m_lastWrittenPos
Definition: mpeg2fix.h:270
void InitialPTSFixup(MPEG2frame *curFrame, int64_t &origvPTS, int64_t &PTSdiscrep, int numframes, bool fix) const
Definition: mpeg2fix.cpp:2033
int Start()
Definition: mpeg2fix.cpp:2092
MythCodecMap m_codecMap
Definition: mpeg2fix.h:241
static int FindMPEG2Header(const uint8_t *buf, int size, uint8_t code)
Definition: mpeg2fix.cpp:438
bool m_mkvFile
Definition: mpeg2fix.h:249
FrameQueue m_framePool
Definition: mpeg2fix.h:230
static void WriteData(const QString &filename, uint8_t *data, int size)
Definition: mpeg2fix.cpp:1111
static int GetFrameTypeN(const MPEG2frame *frame)
Definition: mpeg2fix.h:183
AVCodecParserContext * getCodecParserContext(uint id)
Definition: mpeg2fix.h:213
int m_vidId
Definition: mpeg2fix.h:245
int InsertFrame(int frameNum, int64_t deltaPTS, int64_t ptsIncrement, int64_t initPTS)
Definition: mpeg2fix.cpp:1873
AVCodecContext * getCodecContext(uint id)
Definition: mpeg2fix.h:207
static void inc2x33(int64_t *pts1, int64_t pts2)
Definition: mpeg2fix.cpp:364
int AddFrame(MPEG2frame *f)
Definition: mpeg2fix.cpp:668
static void * ReplexStart(void *data)
Definition: mpeg2fix.cpp:518
MPEG2frame * FindFrameNum(int frameNum)
Definition: mpeg2fix.cpp:1674
FrameList m_vSecondary
Definition: mpeg2fix.h:225
static int64_t add2x33(int64_t pts1, int64_t pts2)
Definition: mpeg2fix.cpp:405
static int64_t udiff2x33(int64_t pts1, int64_t pts2)
Definition: mpeg2fix.cpp:369
bool m_noRepeat
Definition: mpeg2fix.h:253
int m_extCount
Definition: mpeg2fix.h:246
mpeg2dec_t * m_headerDecoder
Definition: mpeg2fix.h:233
bool FindStart()
Definition: mpeg2fix.cpp:1504
static int cmp2x33(int64_t pts1, int64_t pts2)
Definition: mpeg2fix.cpp:413
MPEG2frame * GetPoolFrame(AVPacket *pkt)
Definition: mpeg2fix.cpp:1348
int ProcessVideo(MPEG2frame *vf, mpeg2dec_t *dec)
Definition: mpeg2fix.cpp:892
uint64_t m_fileSize
Definition: mpeg2fix.h:267
FrameList m_vFrame
Definition: mpeg2fix.h:228
void(* m_updateStatus)(float percent_done)
Definition: mpeg2fix.h:223
static void ShowRangeMap(frm_dir_map_t *mapPtr, QString msg)
Definition: mpeg2fix.cpp:1997
int BuildKeyframeIndex(const QString &file, frm_pos_map_t &posMap, frm_pos_map_t &durMap)
Definition: mpeg2fix.cpp:2887
int PlaybackSecondary()
Definition: mpeg2fix.cpp:1713
bool m_realFileEnd
Definition: mpeg2fix.h:262
int64_t m_ptsIncrement
Definition: mpeg2fix.h:248
void SetAllAudio(bool keep)
Definition: mpeg2fix.h:134
bool m_useSecondary
Definition: mpeg2fix.h:226
static void SetFrameNum(uint8_t *ptr, int num)
Definition: mpeg2fix.cpp:865
void FrameInfo(MPEG2frame *f)
Definition: mpeg2fix.cpp:652
static void dumpList(FrameList *list)
Definition: mpeg2fix.cpp:2072
int m_frameNum
Definition: mpeg2fix.h:268
FrameQueue m_unreadFrames
Definition: mpeg2fix.h:231
int GetFrame(AVPacket *pkt)
Definition: mpeg2fix.cpp:1387
frm_dir_map_t m_saveMap
Definition: mpeg2fix.h:237
int GetStreamType(int id) const
Definition: mpeg2fix.h:202
frm_dir_map_t m_delMap
Definition: mpeg2fix.h:236
int m_displayFrame
Definition: mpeg2fix.h:232
int m_maxFrames
Definition: mpeg2fix.h:255
void AddRangeList(const QStringList &rangelist, int type)
Definition: mpeg2fix.cpp:1950
void InitReplex()
Definition: mpeg2fix.cpp:580
mpeg2dec_t * m_imgDecoder
Definition: mpeg2fix.h:234
MPEG2fixup(const QString &inf, const QString &outf, frm_dir_map_t *deleteMap, const char *fmt, bool norp, bool fixPTS, int maxf, bool showprog, int otype, void(*update_func)(float)=nullptr, int(*check_func)()=nullptr)
Definition: mpeg2fix.cpp:221
bool m_showProgress
Definition: mpeg2fix.h:266
static void dec2x33(int64_t *pts1, int64_t pts2)
Definition: mpeg2fix.cpp:359
int m_statusUpdateTime
Definition: mpeg2fix.h:269
int(* m_checkAbort)()
Definition: mpeg2fix.h:222
FrameMap m_aFrame
Definition: mpeg2fix.h:229
const char * m_format
Definition: mpeg2fix.h:257
AVFrame * m_picture
Definition: mpeg2fix.h:243
int ConvertToI(FrameList *orderedFrames, int headPos)
Definition: mpeg2fix.cpp:1803
AVFormatContext * m_inputFC
Definition: mpeg2fix.h:242
bool m_fixPts
Definition: mpeg2fix.h:254
void StoreSecondary()
Definition: mpeg2fix.cpp:1697
bool m_isGop
Definition: mpeg2fix.h:55
mpeg2_picture_t m_mpeg2_pic
Definition: mpeg2fix.h:60
MPEG2frame(int size)
Definition: mpeg2fix.cpp:84
AVPacket * m_pkt
Definition: mpeg2fix.h:53
void ensure_size(int size) const
Definition: mpeg2fix.cpp:96
bool m_isSequence
Definition: mpeg2fix.h:54
uint8_t * m_framePos
Definition: mpeg2fix.h:56
mpeg2_gop_t m_mpeg2_gop
Definition: mpeg2fix.h:59
void set_pkt(AVPacket *newpkt) const
Definition: mpeg2fix.cpp:112
mpeg2_sequence_t m_mpeg2_seq
Definition: mpeg2fix.h:58
uint8_t * m_gopPos
Definition: mpeg2fix.h:57
int WaitBuffers()
Definition: mpeg2fix.cpp:479
ExtTypeIntArray m_exttypcnt
Definition: mpeg2fix.h:106
ringbuffer m_vrBuf
Definition: mpeg2fix.h:100
pthread_mutex_t m_mutex
Definition: mpeg2fix.h:108
RingbufferArray m_indexExtrbuf
Definition: mpeg2fix.h:103
RingbufferArray m_extrbuf
Definition: mpeg2fix.h:101
multiplex_t * m_mplex
Definition: mpeg2fix.h:114
void Start()
Definition: mpeg2fix.cpp:529
AudioFrameArray m_extframe
Definition: mpeg2fix.h:110
ExtTypeIntArray m_exttype
Definition: mpeg2fix.h:105
sequence_t m_seq_head
Definition: mpeg2fix.h:111
pthread_cond_t m_cond
Definition: mpeg2fix.h:109
QString m_outfile
Definition: mpeg2fix.h:98
MPEG2replex()=default
ringbuffer m_indexVrbuf
Definition: mpeg2fix.h:102
int m_otype
Definition: mpeg2fix.h:99
int m_extCount
Definition: mpeg2fix.h:104
int m_done
Definition: mpeg2fix.h:97
AVCodecContext * GetCodecContext(const AVStream *Stream, const AVCodec *Codec=nullptr, bool NullCodec=false)
Definition: mythavutil.cpp:288
QList< int > m_keyList
Definition: mpeg2fix.h:81
void SetNextPos(int64_t newPTS, AVPacket *pkt)
Definition: mpeg2fix.cpp:178
void SetNextPTS(int64_t newPTS, int64_t atPTS)
Definition: mpeg2fix.cpp:165
int64_t Get(int idx, AVPacket *pkt)
Definition: mpeg2fix.cpp:135
int64_t UpdateOrigPTS(int idx, int64_t &origPTS, AVPacket *pkt)
Definition: mpeg2fix.cpp:200
QMap< int, QList< poq_idx_t > > m_offset
Definition: mpeg2fix.h:79
PTSOffsetQueue(int vidid, QList< int > keys, int64_t initPTS)
Definition: mpeg2fix.cpp:119
QMap< int, QList< poq_idx_t > > m_orig
Definition: mpeg2fix.h:80
unsigned int uint
Definition: compat.h:60
uint64_t verboseMask
Definition: logging.cpp:101
QList< MPEG2frame * > FrameList
Definition: mpeg2fix.h:117
QQueue< MPEG2frame * > FrameQueue
Definition: mpeg2fix.h:118
std::array< int, N_AUDIO > ExtTypeIntArray
Definition: mpeg2fix.h:87
MPFListType
Definition: mpeg2fix.h:40
@ MPF_TYPE_CUTLIST
Definition: mpeg2fix.h:41
@ MPF_TYPE_SAVELIST
Definition: mpeg2fix.h:42
QMap< int, FrameList * > FrameMap
Definition: mpeg2fix.h:119
std::array< audio_frame_t, N_AUDIO > AudioFrameArray
Definition: mpeg2fix.h:88
std::array< ringbuffer, N_AUDIO > RingbufferArray
Definition: mpeg2fix.h:86
dictionary info
Definition: azlyrics.py:7
QMap< uint64_t, MarkTypes > frm_dir_map_t
Frame # -> Mark map.
Definition: programtypes.h:117
QMap< long long, long long > frm_pos_map_t
Frame # -> File offset map.
Definition: programtypes.h:44
int64_t newPTS
Definition: mpeg2fix.h:64
bool type
Definition: mpeg2fix.h:67
int64_t pos_pts
Definition: mpeg2fix.h:65
int framenum
Definition: mpeg2fix.h:66