comparison mpegts.c @ 2574:9e51e62f5bdd libavformat

replaced custom tracking of programs/services with calls to with av_new_program()
author nicodvb
date Tue, 25 Sep 2007 20:49:11 +0000
parents c226029c8df4
children 06d31789d338
comparison
equal deleted inserted replaced
2573:2842354cb9a4 2574:9e51e62f5bdd
34 34
35 typedef struct PESContext PESContext; 35 typedef struct PESContext PESContext;
36 36
37 static PESContext* add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid, int stream_type); 37 static PESContext* add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid, int stream_type);
38 static AVStream* new_pes_av_stream(PESContext *pes, uint32_t code); 38 static AVStream* new_pes_av_stream(PESContext *pes, uint32_t code);
39 extern void av_set_program_name(AVProgram *program, char *provider_name, char *name);
39 40
40 enum MpegTSFilterType { 41 enum MpegTSFilterType {
41 MPEGTS_PES, 42 MPEGTS_PES,
42 MPEGTS_SECTION, 43 MPEGTS_SECTION,
43 }; 44 };
73 MpegTSPESFilter pes_filter; 74 MpegTSPESFilter pes_filter;
74 MpegTSSectionFilter section_filter; 75 MpegTSSectionFilter section_filter;
75 } u; 76 } u;
76 }; 77 };
77 78
78 typedef struct MpegTSService {
79 int running:1;
80 int sid; /**< MPEG Program Number of stream */
81 char *provider_name; /**< DVB Network name, "" if not DVB stream */
82 char *name; /**< DVB Service name, "MPEG Program [sid]" if not DVB stream*/
83 } MpegTSService;
84
85 struct MpegTSContext { 79 struct MpegTSContext {
86 /* user data */ 80 /* user data */
87 AVFormatContext *stream; 81 AVFormatContext *stream;
88 /** raw packet size, including FEC if present */ 82 /** raw packet size, including FEC if present */
89 int raw_packet_size; 83 int raw_packet_size;
103 AVPacket *pkt; 97 AVPacket *pkt;
104 98
105 /******************************************/ 99 /******************************************/
106 /* private mpegts data */ 100 /* private mpegts data */
107 /* scan context */ 101 /* scan context */
108 /** number of PMTs in the last PAT seen */
109 int nb_services;
110 /** list of PMTs in the last PAT seen */
111 MpegTSService **services;
112 102
113 103
114 /** filters for various streams specified by PMT + for the PAT and PMT */ 104 /** filters for various streams specified by PMT + for the PAT and PMT */
115 MpegTSFilter *pids[NB_PID_MAX]; 105 MpegTSFilter *pids[NB_PID_MAX];
116 }; 106 };
383 return -1; 373 return -1;
384 h->last_sec_num = val; 374 h->last_sec_num = val;
385 return 0; 375 return 0;
386 } 376 }
387 377
388 static MpegTSService *new_service(MpegTSContext *ts, int sid,
389 char *provider_name, char *name)
390 {
391 MpegTSService *service=NULL;
392 int i;
393
394 #ifdef DEBUG_SI
395 av_log(ts->stream, AV_LOG_DEBUG, "new_service: "
396 "sid=0x%04x provider='%s' name='%s'\n",
397 sid, provider_name, name);
398 #endif
399
400 for(i=0; i<ts->nb_services; i++)
401 if(ts->services[i]->sid == sid)
402 service= ts->services[i];
403
404 if(!service){
405 service = av_mallocz(sizeof(MpegTSService));
406 if (!service)
407 return NULL;
408 dynarray_add(&ts->services, &ts->nb_services, service);
409 }
410 service->sid = sid;
411 assert((!provider_name) == (!name));
412 if(name){
413 av_free(service->provider_name);
414 av_free(service-> name);
415 service->provider_name = provider_name;
416 service-> name = name;
417 }
418 return service;
419 }
420 378
421 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) 379 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
422 { 380 {
423 MpegTSContext *ts = filter->u.section_filter.opaque; 381 MpegTSContext *ts = filter->u.section_filter.opaque;
424 SectionHeader h1, *h = &h1; 382 SectionHeader h1, *h = &h1;
597 av_log(ts->stream, AV_LOG_DEBUG, "sid=0x%x pid=0x%x\n", sid, pmt_pid); 555 av_log(ts->stream, AV_LOG_DEBUG, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
598 #endif 556 #endif
599 if (sid == 0x0000) { 557 if (sid == 0x0000) {
600 /* NIT info */ 558 /* NIT info */
601 } else { 559 } else {
602 new_service(ts, sid, NULL, NULL); 560 av_new_program(ts->stream, sid);
603 ts->stop_parse--; 561 ts->stop_parse--;
604 mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1); 562 mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);
605 } 563 }
606 } 564 }
607 /* not found */ 565 /* not found */
673 break; 631 break;
674 provider_name = getstr8(&p, p_end); 632 provider_name = getstr8(&p, p_end);
675 if (!provider_name) 633 if (!provider_name)
676 break; 634 break;
677 name = getstr8(&p, p_end); 635 name = getstr8(&p, p_end);
678 if (!name) 636 if (name) {
679 break; 637 AVProgram *program = av_new_program(ts->stream, sid);
680 new_service(ts, sid, provider_name, name); 638 if(program)
639 av_set_program_name(program, provider_name, name);
640 }
681 break; 641 break;
682 default: 642 default:
683 break; 643 break;
684 } 644 }
685 p = desc_end; 645 p = desc_end;
1277 MpegTSContext *ts = s->priv_data; 1237 MpegTSContext *ts = s->priv_data;
1278 int i; 1238 int i;
1279 for(i=0;i<NB_PID_MAX;i++) 1239 for(i=0;i<NB_PID_MAX;i++)
1280 if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]); 1240 if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]);
1281 1241
1282 for(i = 0; i < ts->nb_services; i++){
1283 av_free(ts->services[i]->provider_name);
1284 av_free(ts->services[i]->name);
1285 av_free(ts->services[i]);
1286 }
1287 av_freep(&ts->services);
1288
1289 return 0; 1242 return 0;
1290 } 1243 }
1291 1244
1292 static int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index, 1245 static int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index,
1293 int64_t *ppos, int64_t pos_limit) 1246 int64_t *ppos, int64_t pos_limit)