vdr-plugin-softhddevice-drm-gles 1.6.7
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, bool);
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 const char *m_identifier;
50
51 // According to H.222.0 03/2017 Table 2-21 ("PES packet") packet_start_code_prefix
52 // And also according to H.264/HEVC payload
53 static constexpr uint32_t PES_PACKET_START_CODE_PREFIX = 0x00'0001;
55};
56
64class cPesVideo : public cPes {
65public:
66 cPesVideo(const uint8_t *data, int size) : cPes(data, size, false) { cPes::Init(); }
67private:
68 bool IsStreamIdValid(void) override { return (GetStreamId() & 0xF0) == 0xE0; } // Video stream IDs are in the range 0xE0-0xEF
69};
70
79class cPesAudio : public cPes {
80public:
81 cPesAudio(const uint8_t *data, int size) : cPes(data, size, true) { cPes::Init(); }
82 bool IsAudioStreamId(void) { return (GetStreamId() & 0xF0) == 0xC0; } // Audio stream IDs are in the range 0xC0-0xCF
83private:
84 bool IsStreamIdValid(void) override { return IsAudioStreamId() || IsPrivateStreamId(); }
85 bool IsPrivateStreamId(void) { return GetStreamId() == 0xBD; }
86};
87
98public:
100 void Push(const uint8_t *, int, int64_t);
101 void Erase(size_t);
102 int64_t GetPts(void);
103 const uint8_t *Peek(void) { return &m_data[0]; }
104 void Reset(void) { m_data.clear(); m_pts.clear(); }
105 int GetSize(void) { return m_data.size(); }
106 const char *GetIdentifier(void) { return m_identifier; }
107private:
108 const char *m_identifier;
109 std::map<size_t, int64_t> m_pts;
110 std::vector<uint8_t> m_data;
111};
112
122public:
123 virtual void Push(const uint8_t *data, int size, int64_t pts) { m_buffer.Push(data, size, pts); }
124 virtual AVPacket *PopAvPacket(void) = 0;
125 bool IsEmpty(void) { return m_buffer.GetSize() == 0; }
126 size_t GetSize(void) { return m_buffer.GetSize(); }
127 void Reset(void);
128 AVCodecID GetCodec(void) { return m_codec; }
129protected:
131 AVPacket *PopAvPacket(int);
135};
136
146public:
149 bool ParseCodecHeader(const uint8_t *, int);
150 bool HasLeadingZero(const uint8_t *, int);
151private:
152 static constexpr uint32_t VIDEO_FRAME_START_CODE = 0x00'0001;
153 static constexpr int VIDEO_FRAME_START_CODE_LEN = 3;
154
155 static constexpr uint8_t MPEG2_STREAM_TYPE = 0xB3;
156 static constexpr uint8_t H264_STREAM_TYPE = 0x09;
157 static constexpr uint8_t HEVC_STREAM_TYPE = 0x46;
158};
159
169
191
192#endif
Audio PES Packet Parser.
Definition pes.h:79
cPesAudio(const uint8_t *data, int size)
Definition pes.h:81
bool IsPrivateStreamId(void)
Definition pes.h:85
bool IsAudioStreamId(void)
Definition pes.h:82
bool IsStreamIdValid(void) override
Definition pes.h:84
Video PES Packet Parser.
Definition pes.h:64
bool IsStreamIdValid(void) override
Definition pes.h:68
cPesVideo(const uint8_t *data, int size)
Definition pes.h:66
PES Packet Parser.
Definition pes.h:30
static constexpr uint32_t PES_PACKET_START_CODE_PREFIX
Definition pes.h:53
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:329
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:342
bool HasPts(void)
Check if the PES packet contains a Presentation Time Stamp (PTS)
Definition pes.cpp:300
const char * m_identifier
identifier string for logging
Definition pes.h:49
bool IsHeaderValid(void)
Check if the PES header is valid.
Definition pes.cpp:287
int GetPacketLength(void)
Get the total length of the PES packet.
Definition pes.cpp:364
static constexpr uint32_t PES_PACKET_START_CODE_PREFIX_LEN
Definition pes.h:54
bool IsValid(void)
Check if the PES packet is valid.
Definition pes.cpp:273
int64_t GetPts(void)
Get the Presentation Time Stamp (PTS) from the PES header.
Definition pes.cpp:313
void Init(void)
Initialize and validate the PES packet.
Definition pes.cpp:244
PTS Tracking Buffer.
Definition pes.h:97
int64_t GetPts(void)
Get the PTS value for the current buffer position.
Definition pes.cpp:744
const char * GetIdentifier(void)
Definition pes.h:106
int GetSize(void)
Definition pes.h:105
void Push(const uint8_t *, int, int64_t)
Push data into the PTS tracking buffer.
Definition pes.cpp:680
std::vector< uint8_t > m_data
Byte buffer.
Definition pes.h:110
cPtsTrackingBuffer(const char *identifier)
Definition pes.h:99
std::map< size_t, int64_t > m_pts
Map of buffer positions to PTS values.
Definition pes.h:109
const uint8_t * Peek(void)
Definition pes.h:103
void Reset(void)
Definition pes.h:104
void Erase(size_t)
Erase data from the beginning of the buffer.
Definition pes.cpp:701
const char * m_identifier
Definition pes.h:108
Audio Stream Reassembly Buffer.
Definition pes.h:178
AVCodecID TruncateBufferUntilFirstValidData(void)
Truncate buffer until the first valid audio frame.
Definition pes.cpp:527
static constexpr int MAX_HEADER_SIZE
Definition pes.h:188
AVCodecID DetectCodecFromSyncWord(const uint8_t *, int)
Detect audio codec from sync word pattern.
Definition pes.cpp:625
SyncWordInfo FindSyncWord(const uint8_t *, int)
Find the first audio sync word in data.
Definition pes.cpp:603
cReassemblyBufferAudio(void)
Definition pes.h:180
SyncWordInfo FindTwoConsecutiveFramesWithSameSyncWord()
Find two consecutive audio frames with the same sync word.
Definition pes.cpp:555
AVPacket * PopAvPacket(void) override
Pop an audio AVPacket from the reassembly buffer.
Definition pes.cpp:486
bool m_ptsInvalid
flag indicating if PTS is invalid for current buffer, because it was truncated
Definition pes.h:189
int GetFrameSizeForCodec(AVCodecID, const uint8_t *)
Get the frame size for a given codec and frame header.
Definition pes.cpp:649
Video Stream Reassembly Buffer.
Definition pes.h:145
AVPacket * PopAvPacket(void) override
Definition pes.h:148
static constexpr uint32_t VIDEO_FRAME_START_CODE
Definition pes.h:152
static constexpr int VIDEO_FRAME_START_CODE_LEN
Definition pes.h:153
static constexpr uint8_t H264_STREAM_TYPE
Definition pes.h:156
static constexpr uint8_t MPEG2_STREAM_TYPE
Definition pes.h:155
bool HasLeadingZero(const uint8_t *, int)
Check if video data has a leading zero byte before the start code.
Definition pes.cpp:469
static constexpr uint8_t HEVC_STREAM_TYPE
Definition pes.h:157
cReassemblyBufferVideo(void)
Definition pes.h:147
bool ParseCodecHeader(const uint8_t *, int)
Parse video codec header to detect codec type.
Definition pes.cpp:432
Base Class for Stream Reassembly Buffers.
Definition pes.h:121
AVCodecID m_codec
detected codec ID
Definition pes.h:132
AVCodecID GetCodec(void)
Definition pes.h:128
void Reset(void)
Reset the reassembly buffer.
Definition pes.cpp:659
int64_t m_lastPoppedPts
PTS of the last popped AVPacket.
Definition pes.h:134
virtual void Push(const uint8_t *data, int size, int64_t pts)
Definition pes.h:123
virtual AVPacket * PopAvPacket(void)=0
cPtsTrackingBuffer m_buffer
fragmentation buffer
Definition pes.h:133
bool IsEmpty(void)
Definition pes.h:125
cReassemblyBuffer(const char *identifier)
Definition pes.h:130
size_t GetSize(void)
Definition pes.h:126
#define AV_NOPTS_VALUE
Definition misc.h:74
Information about a detected audio sync word.
Definition pes.h:165
AVCodecID codecId
Detected codec ID.
Definition pes.h:166
int pos
Position of sync word in buffer.
Definition pes.h:167