MythTV master
AVCParser.h
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2/*******************************************************************
3 * AVCParser
4 *
5 * Distributed as part of MythTV (www.mythtv.org)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 *
21 ********************************************************************/
22
23#ifndef AVCPARSER_H
24#define AVCPARSER_H
25
26#include <array>
27
28#include "mpeg/H2645Parser.h"
29
30class AVCParser : public H2645Parser
31{
32 public:
33
34 // ITU-T Rec. H.264 table 7-1
35 enum NAL_unit_type : std::int8_t {
36 UNKOWN = -1,
37 SLICE = 1, // 1 - 5 are VCL NAL units
42 SEI = 6,
43 SPS = 7,
44 PPS = 8,
49 SPS_EXT = 13,
54 };
55
56 enum SEI_type : std::uint8_t {
61 };
62
63 field_type getFieldType(void) const override;
64
65 /*
66 slice_type values in the range 5..9 specify, in addition to the
67 coding type of the current slice, that all other slices of the
68 current coded picture shall have a value of slice_type equal to
69 the current value of slice_type or equal to the current value of
70 slice_type – 5.
71 */
72 AVCParser(void) { ; }
73 AVCParser(const AVCParser& rhs);
74 ~AVCParser(void) override { ; }
75
76 uint32_t addBytes(const uint8_t *bytes,
77 uint32_t byte_count,
78 uint64_t stream_offset) override;
79 void Reset(void) override;
80
81 QString NAL_type_str(int8_t type) override;
82
83 // == NAL_type AU_delimiter: primary_pic_type = 5
84 static bool isKeySlice(uint slice_type)
85 {
86 return (slice_type == SLICE_I ||
87 slice_type == SLICE_SI ||
88 slice_type == SLICE_I_a ||
89 slice_type == SLICE_SI_a);
90 }
91
92 static bool NALisSlice(int8_t nal_type)
93 {
94 return (nal_type == SLICE ||
95 nal_type == SLICE_DPA ||
96 nal_type == SLICE_IDR);
97 }
98
99 void use_I_forKeyframes(bool val) { m_iIsKeyframe = val; }
100 bool using_I_forKeyframes(void) const { return m_iIsKeyframe; }
101
102 void parse_SPS(uint8_t *sps, uint32_t sps_size,
103 bool& interlaced, int32_t& max_ref_frames);
104
105 void reset_SPS(void) { m_seenSPS = false; }
106 bool seen_SPS(void) const { return m_seenSPS; }
107
108 bool found_AU(void) const { return m_auPending; }
109
110 uint8_t lastNALtype(void) const { return m_nalUnitType; }
111
112 uint getRefFrames(void) const { return m_numRefFrames; }
113
114 uint pictureWidthCropped(void) const override;
115 uint pictureHeightCropped(void) const override;
116
117 double frameRate(void) const;
118 MythAVRational getFrameRate() const override;
119
120 void set_AU_pending(void)
121 {
122 if (!m_auPending)
123 {
124 m_auPending = true;
127 }
128 }
129
130 protected:
131 bool new_AU(void);
132 void processRBSP(bool rbsp_complete);
133
134 private:
135 bool decode_Header(BitReader& br);
136 void decode_SPS(BitReader& br);
137 void decode_PPS(BitReader& br);
138 void decode_SEI(BitReader& br);
139
140
142 std::array<int,2> m_deltaPicOrderCnt {0};
143 int m_frameNum {-1};
147 std::array<int,2> m_prevDeltaPicOrderCnt {0};
151
160
161 int8_t m_bottomFieldFlag {-1};
162 int8_t m_fieldPicFlag {-1};
170
172 uint8_t m_nalRefIdc {111}; // != [0|1|2|3]
173 uint8_t m_picOrderCntType {0};
174 uint8_t m_prevNALRefIdc {111}; // != [0|1|2|3]
176
178 bool m_iIsKeyframe {true};
179};
180
181#endif /* AVCPARSER_H */
~AVCParser(void) override
Definition: AVCParser.h:74
bool found_AU(void) const
Definition: AVCParser.h:108
bool using_I_forKeyframes(void) const
Definition: AVCParser.h:100
int m_prevFrameNum
Definition: AVCParser.h:148
@ SEI_TYPE_RECOVERY_POINT
Definition: AVCParser.h:60
@ SEI_TYPE_USER_DATA_UNREGISTERED
Definition: AVCParser.h:59
@ SEI_FILLER_PAYLOAD
Definition: AVCParser.h:58
@ SEI_TYPE_PIC_TIMING
Definition: AVCParser.h:57
uint m_sliceType
Definition: AVCParser.h:159
bool decode_Header(BitReader &br)
Definition: AVCParser.cpp:495
uint pictureWidthCropped(void) const override
Definition: AVCParser.cpp:1027
int8_t m_prevNalUnitType
Definition: AVCParser.h:168
int m_deltaPicOrderCntBottom
Definition: AVCParser.h:141
void set_AU_pending(void)
Definition: AVCParser.h:120
int8_t m_redundantPicCntPresentFlag
Definition: AVCParser.h:169
@ AUXILIARY_SLICE
Definition: AVCParser.h:52
@ SLICE_DPA
Definition: AVCParser.h:38
@ SLICE_DPB
Definition: AVCParser.h:39
@ FILLER_DATA
Definition: AVCParser.h:48
@ SLICE_DPC
Definition: AVCParser.h:40
@ END_STREAM
Definition: AVCParser.h:47
@ AU_DELIMITER
Definition: AVCParser.h:45
@ SLICE_IDR
Definition: AVCParser.h:41
@ SPS_subset
Definition: AVCParser.h:51
@ SLICE_EXTENSION
Definition: AVCParser.h:53
@ NALU_prefix
Definition: AVCParser.h:50
@ END_SEQUENCE
Definition: AVCParser.h:46
uint8_t m_nalRefIdc
Definition: AVCParser.h:172
void processRBSP(bool rbsp_complete)
Definition: AVCParser.cpp:416
AVCParser(void)
Definition: AVCParser.h:72
uint8_t lastNALtype(void) const
Definition: AVCParser.h:110
int m_prevDeltaPicOrderCntBottom
Definition: AVCParser.h:146
uint m_prevIdrPicId
Definition: AVCParser.h:156
std::array< int, 2 > m_deltaPicOrderCnt
Definition: AVCParser.h:142
void parse_SPS(uint8_t *sps, uint32_t sps_size, bool &interlaced, int32_t &max_ref_frames)
Definition: AVCParser.cpp:893
std::array< int, 2 > m_prevDeltaPicOrderCnt
Definition: AVCParser.h:147
int m_picParameterSetId
Definition: AVCParser.h:145
uint8_t m_deltaPicOrderAlwaysZeroFlag
Definition: AVCParser.h:171
int8_t m_frameMbsOnlyFlag
Definition: AVCParser.h:163
QString NAL_type_str(int8_t type) override
Definition: AVCParser.cpp:130
int8_t m_fieldPicFlag
Definition: AVCParser.h:162
MythAVRational getFrameRate() const override
Definition: AVCParser.cpp:1077
void reset_SPS(void)
Definition: AVCParser.h:105
int m_picOrderCntLsb
Definition: AVCParser.h:144
bool m_auContainsKeyframeMessage
Definition: AVCParser.h:177
int m_prevPicOrderCntLsb
Definition: AVCParser.h:149
uint8_t m_prevPicOrderCntType
Definition: AVCParser.h:175
uint32_t addBytes(const uint8_t *bytes, uint32_t byte_count, uint64_t stream_offset) override
Definition: AVCParser.cpp:285
bool new_AU(void)
Definition: AVCParser.cpp:166
uint m_numRefFrames
Definition: AVCParser.h:155
void use_I_forKeyframes(bool val)
Definition: AVCParser.h:99
uint m_seqParameterSetId
Definition: AVCParser.h:158
int8_t m_prevFieldPicFlag
Definition: AVCParser.h:167
int8_t m_prevBottomFieldFlag
Definition: AVCParser.h:166
uint m_log2MaxFrameNum
Definition: AVCParser.h:153
uint8_t m_picOrderCntType
Definition: AVCParser.h:173
static bool isKeySlice(uint slice_type)
Definition: AVCParser.h:84
void decode_PPS(BitReader &br)
Definition: AVCParser.cpp:902
uint pictureHeightCropped(void) const override
Definition: AVCParser.cpp:1039
int m_frameNum
Definition: AVCParser.h:143
int m_prevPicParameterSetId
Definition: AVCParser.h:150
uint m_redundantPicCnt
Definition: AVCParser.h:157
bool m_iIsKeyframe
Definition: AVCParser.h:178
uint m_idrPicId
Definition: AVCParser.h:152
field_type getFieldType(void) const override
Definition: AVCParser.cpp:1050
void decode_SPS(BitReader &br)
Definition: AVCParser.cpp:695
double frameRate(void) const
Definition: AVCParser.cpp:1069
static bool NALisSlice(int8_t nal_type)
Definition: AVCParser.h:92
void Reset(void) override
Definition: AVCParser.cpp:88
uint getRefFrames(void) const
Definition: AVCParser.h:112
AVCParser(const AVCParser &rhs)
bool seen_SPS(void) const
Definition: AVCParser.h:106
int8_t m_nalUnitType
Definition: AVCParser.h:164
uint m_log2MaxPicOrderCntLsb
Definition: AVCParser.h:154
int8_t m_picOrderPresentFlag
Definition: AVCParser.h:165
void decode_SEI(BitReader &br)
Definition: AVCParser.cpp:980
uint8_t m_prevNALRefIdc
Definition: AVCParser.h:174
int8_t m_bottomFieldFlag
Definition: AVCParser.h:161
uint64_t m_pktOffset
Definition: H2645Parser.h:117
uint64_t m_auOffset
Definition: H2645Parser.h:114
bool m_auPending
Definition: H2645Parser.h:143
bool m_seenSPS
Definition: H2645Parser.h:150
C++ wrapper for FFmpeg libavutil AVRational.
unsigned int uint
Definition: freesurround.h:24