Mercurial > libavformat.hg
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) |