|
@@ -159,6 +159,74 @@ void process_pmt(struct ts *ts, uint16_t pid, uint8_t *ts_packet) {
|
159
|
159
|
}
|
160
|
160
|
}
|
161
|
161
|
|
|
162
|
+static int sdt_parse_service_name_desc(
|
|
163
|
+ int desc_len, uint8_t *desc,
|
|
164
|
+ uint8_t *pname_len, uint8_t **pname,
|
|
165
|
+ uint8_t *sname_len, uint8_t **sname)
|
|
166
|
+{
|
|
167
|
+ int ofs = 0;
|
|
168
|
+ *pname_len = 0;
|
|
169
|
+ *sname_len = 0;
|
|
170
|
+ *pname = NULL;
|
|
171
|
+ *sname = NULL;
|
|
172
|
+ while (ofs + 2 < desc_len) {
|
|
173
|
+ uint8_t tag = desc[ofs++];
|
|
174
|
+ uint8_t len = desc[ofs++];
|
|
175
|
+ if (tag != 0x48) {
|
|
176
|
+ ofs += len;
|
|
177
|
+ continue;
|
|
178
|
+ }
|
|
179
|
+ // Parse descriptor 0x48 - Service name descriptor
|
|
180
|
+ // +3 == +1 for service type, +1 for provider len, +1 for service len
|
|
181
|
+ if (ofs + 3 > desc_len)
|
|
182
|
+ break;
|
|
183
|
+
|
|
184
|
+ ofs++; // Skip service type
|
|
185
|
+
|
|
186
|
+ *pname_len = desc[ofs++];
|
|
187
|
+ if (*pname_len)
|
|
188
|
+ *pname = desc + ofs;
|
|
189
|
+ ofs += *pname_len;
|
|
190
|
+ if (ofs > desc_len)
|
|
191
|
+ break;
|
|
192
|
+
|
|
193
|
+ *sname_len = desc[ofs++];
|
|
194
|
+ if (*sname_len)
|
|
195
|
+ *sname = desc + ofs;
|
|
196
|
+ ofs += *sname_len;
|
|
197
|
+
|
|
198
|
+ return 1;
|
|
199
|
+ }
|
|
200
|
+ return 0;
|
|
201
|
+}
|
|
202
|
+
|
|
203
|
+void process_sdt(struct ts *ts, uint16_t pid, uint8_t *ts_packet) {
|
|
204
|
+ int i;
|
|
205
|
+
|
|
206
|
+ if (pid != 0x11)
|
|
207
|
+ return;
|
|
208
|
+
|
|
209
|
+ handle_table_changes(sdt);
|
|
210
|
+
|
|
211
|
+ for(i=0;i<ts->sdt->streams_num;i++) {
|
|
212
|
+ struct ts_sdt_stream *stream = ts->sdt->streams[i];
|
|
213
|
+ uint8_t *pname, *sname;
|
|
214
|
+ uint8_t pname_len, sname_len;
|
|
215
|
+ if (sdt_parse_service_name_desc(
|
|
216
|
+ stream->descriptor_size, stream->descriptor_data,
|
|
217
|
+ &pname_len, &pname, &sname_len, &sname))
|
|
218
|
+ {
|
|
219
|
+ ts_LOGf("SDT | Service 0x%04x (%5d) Provider: \"%.*s\" Service: \"%.*s\"\n",
|
|
220
|
+ stream->service_id, stream->service_id,
|
|
221
|
+ pname_len, (char *)pname,
|
|
222
|
+ sname_len, (char *)sname);
|
|
223
|
+ } else {
|
|
224
|
+ ts_LOGf("SDT | Service 0x%04x (%5d)\n",
|
|
225
|
+ stream->service_id, stream->service_id);
|
|
226
|
+ }
|
|
227
|
+ }
|
|
228
|
+}
|
|
229
|
+
|
162
|
230
|
#define dump_sz (16)
|
163
|
231
|
#define dump_buf_sz (dump_sz * 6)
|
164
|
232
|
|