Browse Source

Parse SDT and display provider and service name.

Georgi Chorbadzhiyski 12 years ago
parent
commit
2b1c54b830
6 changed files with 75 additions and 0 deletions
  1. 1
    0
      ChangeLog
  2. 3
    0
      data.c
  3. 1
    0
      data.h
  4. 1
    0
      process.c
  5. 68
    0
      tables.c
  6. 1
    0
      tables.h

+ 1
- 0
ChangeLog View File

@@ -4,6 +4,7 @@ xxxx-xx-xx : Version next
4 4
  * Fix payload offset detection, a bug which broke packets that have
5 5
    adaptation with whole packet size (libtsfuncs).
6 6
  * Add --input-service option, to choose service id (program) in MPTS input.
7
+ * Parse SDT and display provider and service name.
7 8
 
8 9
 2011-11-18 : Version 4.0
9 10
  * Set CAMD sockets NODELAY to avoid OSCAM errors when many packets are sent.

+ 3
- 0
data.c View File

@@ -33,6 +33,9 @@ void data_init(struct ts *ts) {
33 33
 	ts->pmt      = ts_pmt_alloc();
34 34
 	ts->curpmt   = ts_pmt_alloc();
35 35
 
36
+	ts->sdt      = ts_sdt_alloc();
37
+	ts->cursdt   = ts_sdt_alloc();
38
+
36 39
 	ts->emm      = ts_privsec_alloc();
37 40
 	ts->last_emm = ts_privsec_alloc();
38 41
 	ts->tmp_emm  = ts_privsec_alloc();

+ 1
- 0
data.h View File

@@ -107,6 +107,7 @@ struct ts {
107 107
 	struct ts_pat		*pat, *curpat;
108 108
 	struct ts_cat		*cat, *curcat;
109 109
 	struct ts_pmt		*pmt, *curpmt;
110
+	struct ts_sdt		*sdt, *cursdt;
110 111
 	struct ts_privsec	*emm, *last_emm;
111 112
 	struct ts_privsec	*ecm, *last_ecm;
112 113
 	struct ts_privsec	*tmp_emm;

+ 1
- 0
process.c View File

@@ -271,6 +271,7 @@ void process_packets(struct ts *ts, uint8_t *data, ssize_t data_len) {
271 271
 		process_pat(ts, pid, ts_packet);
272 272
 		process_cat(ts, pid, ts_packet);
273 273
 		process_pmt(ts, pid, ts_packet);
274
+		process_sdt(ts, pid, ts_packet);
274 275
 		process_emm(ts, pid, ts_packet);
275 276
 		process_ecm(ts, pid, ts_packet);
276 277
 

+ 68
- 0
tables.c View File

@@ -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
 

+ 1
- 0
tables.h View File

@@ -23,6 +23,7 @@
23 23
 void process_pat(struct ts *ts, uint16_t pid, uint8_t *ts_packet);
24 24
 void process_cat(struct ts *ts, uint16_t pid, uint8_t *ts_packet);
25 25
 void process_pmt(struct ts *ts, uint16_t pid, uint8_t *ts_packet);
26
+void process_sdt(struct ts *ts, uint16_t pid, uint8_t *ts_packet);
26 27
 void process_emm(struct ts *ts, uint16_t pid, uint8_t *ts_packet);
27 28
 void process_ecm(struct ts *ts, uint16_t pid, uint8_t *ts_packet);
28 29
 

Loading…
Cancel
Save