vdr-plugin-softhddevice-drm-gles 1.6.4-d0291bb
pes.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-or-later
2
10#ifndef __SOFTHDDEVICE_PES_H
11#define __SOFTHDDEVICE_PES_H
12
13#include <cstdint>
14#include <map>
15#include <vector>
16
17extern "C"
18{
19#include <libavcodec/avcodec.h>
20}
21
30class cPes {
31public:
32 cPes(const uint8_t *, int);
33 bool IsValid(void);
34 bool HasPts(void);
35 int64_t GetPts(void);
36 const uint8_t *GetPayload(void);
37 int GetPayloadSize(void);
38 int GetPacketLength(void);
39 uint8_t GetStreamId(void) { return m_data[3]; }
40
41protected:
42 virtual bool IsStreamIdValid(void) = 0;
43 void Init(void);
44 bool IsHeaderValid(void);
45
46 bool m_valid = false;
47 const uint8_t *m_data;
48 int m_size;
49
50 // According to H.222.0 03/2017 Table 2-21 ("PES packet") packet_start_code_prefix
51 // And also according to H.264/HEVC payload
52 static constexpr uint32_t PES_PACKET_START_CODE_PREFIX = 0x00'0001;
54};
55
63class cPesVideo : public cPes {
64public:
65 cPesVideo(const uint8_t *data, int size) : cPes(data, size) { cPes::Init(); }
66private:
67 bool IsStreamIdValid(void) override { return (GetStreamId() & 0xF0) == 0xE0; } // Video stream IDs are in the range 0xE0-0xEF
68};
69
78class cPesAudio : public cPes {
79public:
80 cPesAudio(const uint8_t *data, int size) : cPes(data, size) { cPes::Init(); }
81 bool IsAudioStreamId(void) { return (GetStreamId() & 0xF0) == 0xC0; } // Audio stream IDs are in the range 0xC0-0xCF
82private:
83 bool IsStreamIdValid(void) override { return IsAudioStreamId() || IsPrivateStreamId(); }
84 bool IsPrivateStreamId(void) { return GetStreamId() == 0xBD; }
85};
86
97public:
99 void Push(const uint8_t *, int, int64_t);
100 void Erase(size_t);
101 int64_t GetPts(void);
102 const uint8_t *Peek(void) { return &m_data[0]; }
103 void Reset(void) { m_data.clear(); m_pts.clear(); }
104 int GetSize(void) { return m_data.size(); }
105 const char *GetIdentifier(void) { return m_identifier; }
106private:
107 const char *m_identifier;
108 std::map<size_t, int64_t> m_pts;
109 std::vector<uint8_t> m_data;
110};
111
121public:
122 virtual void Push(const uint8_t *data, int size, int64_t pts) { m_buffer.Push(data, size, pts); }
123 virtual AVPacket *PopAvPacket(void) = 0;
124 bool IsEmpty(void) { return m_buffer.GetSize() == 0; }
125 size_t GetSize(void) { return m_buffer.GetSize(); }
126 void Reset(void);
127 AVCodecID GetCodec(void) { return m_codec; }
128protected:
130 AVPacket *PopAvPacket(int);
134};
135
145public:
148 bool ParseCodecHeader(const uint8_t *, int);
149 bool HasLeadingZero(const uint8_t *, int);
150private:
151 static constexpr uint32_t VIDEO_FRAME_START_CODE = 0x00'0001;
152 static constexpr int VIDEO_FRAME_START_CODE_LEN = 3;
153
154 static constexpr uint8_t MPEG2_STREAM_TYPE = 0xB3;
155 static constexpr uint8_t H264_STREAM_TYPE = 0x09;
156 static constexpr uint8_t HEVC_STREAM_TYPE = 0x46;
157};
158
168
190
191#endif
Audio PES Packet Parser.
Definition pes.h:78
cPesAudio(const uint8_t *data, int size)
Definition pes.h:80
bool IsPrivateStreamId(void)
Definition pes.h:84
bool IsAudioStreamId(void)
Definition pes.h:81
bool IsStreamIdValid(void) override
Definition pes.h:83
Video PES Packet Parser.
Definition pes.h:63
bool IsStreamIdValid(void) override
Definition pes.h:67
cPesVideo(const uint8_t *data, int size)
Definition pes.h:65
PES Packet Parser.
Definition pes.h:30
static constexpr uint32_t PES_PACKET_START_CODE_PREFIX
Definition pes.h:52
bool m_valid
flag indicating if the PES packet is valid
Definition pes.h:46
virtual bool IsStreamIdValid(void)=0
int m_size
size of the PES packet
Definition pes.h:48
const uint8_t * GetPayload(void)
Get a pointer to the PES payload data.
Definition pes.cpp:304
const uint8_t * m_data
pointer to the raw PES packet data
Definition pes.h:47
uint8_t GetStreamId(void)
Definition pes.h:39
int GetPayloadSize(void)
Get the size of the PES payload.
Definition pes.cpp:317
bool HasPts(void)
Check if the PES packet contains a Presentation Time Stamp (PTS)
Definition pes.cpp:275
bool IsHeaderValid(void)
Check if the PES header is valid.
Definition pes.cpp:262
int GetPacketLength(void)
Get the total length of the PES packet.
Definition pes.cpp:339
static constexpr uint32_t PES_PACKET_START_CODE_PREFIX_LEN
Definition pes.h:53
bool IsValid(void)
Check if the PES packet is valid.
Definition pes.cpp:248
int64_t GetPts(void)
Get the Presentation Time Stamp (PTS) from the PES header.
Definition pes.cpp:288
void Init(void)
Initialize and validate the PES packet.
Definition pes.cpp:222
PTS Tracking Buffer.
Definition pes.h:96
int64_t GetPts(void)
Get the PTS value for the current buffer position.
Definition pes.cpp:707
const char * GetIdentifier(void)
Definition pes.h:105
int GetSize(void)
Definition pes.h:104
void Push(const uint8_t *, int, int64_t)
Push data into the PTS tracking buffer.
Definition pes.cpp:648
std::vector< uint8_t > m_data
Byte buffer.
Definition pes.h:109
cPtsTrackingBuffer(const char *identifier)
Definition pes.h:98
std::map< size_t, int64_t > m_pts
Map of buffer positions to PTS values.
Definition pes.h:108
const uint8_t * Peek(void)
Definition pes.h:102
void Reset(void)
Definition pes.h:103
void Erase(size_t)
Erase data from the beginning of the buffer.
Definition pes.cpp:669
const char * m_identifier
Definition pes.h:107
Audio Stream Reassembly Buffer.
Definition pes.h:177
AVCodecID TruncateBufferUntilFirstValidData(void)
Truncate buffer until the first valid audio frame.
Definition pes.cpp:496
static constexpr int MAX_HEADER_SIZE
Definition pes.h:187
AVCodecID DetectCodecFromSyncWord(const uint8_t *, int)
Detect audio codec from sync word pattern.
Definition pes.cpp:593
SyncWordInfo FindSyncWord(const uint8_t *, int)
Find the first audio sync word in data.
Definition pes.cpp:571
cReassemblyBufferAudio(void)
Definition pes.h:179
SyncWordInfo FindTwoConsecutiveFramesWithSameSyncWord()
Find two consecutive audio frames with the same sync word.
Definition pes.cpp:524
AVPacket * PopAvPacket(void) override
Pop an audio AVPacket from the reassembly buffer.
Definition pes.cpp:458
bool m_ptsInvalid
flag indicating if PTS is invalid for current buffer, because it was truncated
Definition pes.h:188
int GetFrameSizeForCodec(AVCodecID, const uint8_t *)
Get the frame size for a given codec and frame header.
Definition pes.cpp:617
Video Stream Reassembly Buffer.
Definition pes.h:144
AVPacket * PopAvPacket(void) override
Definition pes.h:147
static constexpr uint32_t VIDEO_FRAME_START_CODE
Definition pes.h:151
static constexpr int VIDEO_FRAME_START_CODE_LEN
Definition pes.h:152
static constexpr uint8_t H264_STREAM_TYPE
Definition pes.h:155
static constexpr uint8_t MPEG2_STREAM_TYPE
Definition pes.h:154
bool HasLeadingZero(const uint8_t *, int)
Check if video data has a leading zero byte before the start code.
Definition pes.cpp:441
static constexpr uint8_t HEVC_STREAM_TYPE
Definition pes.h:156
cReassemblyBufferVideo(void)
Definition pes.h:146
bool ParseCodecHeader(const uint8_t *, int)
Parse video codec header to detect codec type.
Definition pes.cpp:407
Base Class for Stream Reassembly Buffers.
Definition pes.h:120
AVCodecID m_codec
detected codec ID
Definition pes.h:131
AVCodecID GetCodec(void)
Definition pes.h:127
void Reset(void)
Reset the reassembly buffer.
Definition pes.cpp:627
int64_t m_lastPoppedPts
PTS of the last popped AVPacket.
Definition pes.h:133
virtual void Push(const uint8_t *data, int size, int64_t pts)
Definition pes.h:122
virtual AVPacket * PopAvPacket(void)=0
cPtsTrackingBuffer m_buffer
fragmentation buffer
Definition pes.h:132
bool IsEmpty(void)
Definition pes.h:124
cReassemblyBuffer(const char *identifier)
Definition pes.h:129
size_t GetSize(void)
Definition pes.h:125
#define AV_NOPTS_VALUE
Definition misc.h:74
Information about a detected audio sync word.
Definition pes.h:164
AVCodecID codecId
Detected codec ID.
Definition pes.h:165
int pos
Position of sync word in buffer.
Definition pes.h:166