@@ -28,6 +28,39 @@ static struct pes_t* pmt_fetch(struct pmt_t* pmt, uint16_t pid)
28
28
return & pmt -> streams [pmt -> stream_count ++ ];
29
29
}
30
30
31
+ static int pmt_read_program_descriptor (struct pmt_t * pmt , const uint8_t * data , uint16_t bytes )
32
+ {
33
+ uint8_t tag ;
34
+ uint8_t len ;
35
+ uint8_t channels ;
36
+
37
+ // Registration descriptor
38
+ while (bytes > 2 )
39
+ {
40
+ tag = data [0 ];
41
+ len = data [1 ];
42
+ if (len + 2 > bytes )
43
+ return -1 ; // invalid len
44
+
45
+ // ISO/IEC 13818-1:2018 (E) Table 2-45 Program and program element descriptors (p90)
46
+ switch (tag )
47
+ {
48
+ case 0x05 : // 2.6.8 Registration descriptor(p94)
49
+ if (len >= 4 && 'C' == data [2 ] && 'U' == data [3 ] && 'E' == data [4 ] && 'I' == data [5 ])
50
+ {
51
+ memcpy (pmt -> proginfo , data + 2 , 4 );
52
+ }
53
+ break ;
54
+ }
55
+
56
+ data += len + 2 ;
57
+ bytes -= len + 2 ;
58
+ }
59
+ assert (0 == bytes );
60
+
61
+ return 0 ;
62
+ }
63
+
31
64
static int pmt_read_descriptor (struct pes_t * stream , const uint8_t * data , uint16_t bytes )
32
65
{
33
66
uint8_t tag ;
@@ -51,7 +84,7 @@ static int pmt_read_descriptor(struct pes_t* stream, const uint8_t* data, uint16
51
84
assert (PSI_STREAM_PRIVATE_DATA == stream -> codecid );
52
85
stream -> codecid = PSI_STREAM_AUDIO_OPUS ;
53
86
}
54
- if (len >= 4 && 'A' == data [2 ] && 'V' == data [3 ] && '0' == data [4 ] && '1' == data [5 ])
87
+ else if (len >= 4 && 'A' == data [2 ] && 'V' == data [3 ] && '0' == data [4 ] && '1' == data [5 ])
55
88
{
56
89
// https://aomediacodec.github.io/av1-mpeg2-ts/
57
90
// Constraints on AV1 streams in MPEG-2 TS
@@ -154,6 +187,7 @@ size_t pmt_read(struct pmt_t *pmt, const uint8_t* data, size_t bytes)
154
187
if (program_info_length > 2 )
155
188
{
156
189
// descriptor(data + 12, program_info_length)
190
+ pmt_read_program_descriptor (pmt , data + 12 , program_info_length );
157
191
}
158
192
159
193
PMT_VERSION_CHANGE :
@@ -162,7 +196,7 @@ size_t pmt_read(struct pmt_t *pmt, const uint8_t* data, size_t bytes)
162
196
{
163
197
pid = ((data [i + 1 ] & 0x1F ) << 8 ) | data [i + 2 ];
164
198
len = ((data [i + 3 ] & 0x0F ) << 8 ) | data [i + 4 ];
165
- // printf("PMT: pn: %0x, pid: %0x, codec: %0x, eslen: %d\n", (unsigned int)pmt->pn, (unsigned int)pid, (unsigned int)data[i], (unsigned int)len);
199
+ // printf("PMT: pn: 0x %0x, pid: 0x %0x, codec: 0x %0x, eslen: %d\n", (unsigned int)pmt->pn, (unsigned int)pid, (unsigned int)data[i], (unsigned int)len);
166
200
167
201
if (i + len + 5 > section_length + 3 - 4 /*CRC32*/ )
168
202
break ; // mark error ?
0 commit comments