|
|
|
@ -348,7 +348,7 @@ static void pmt_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
|
#ifdef DEBUG_SI |
|
|
|
|
printf("sid=0x%x sec_num=%d/%d\n", h->id, h->sec_num, h->last_sec_num); |
|
|
|
|
#endif |
|
|
|
|
if (h->tid != PMT_TID || h->id != ts->req_sid) |
|
|
|
|
if (h->tid != PMT_TID || (ts->req_sid >= 0 && h->id != ts->req_sid) ) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
pcr_pid = get16(&p, p_end) & 0x1fff; |
|
|
|
@ -383,8 +383,10 @@ static void pmt_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
|
|
|
|
|
|
/* now create ffmpeg stream */ |
|
|
|
|
switch(stream_type) { |
|
|
|
|
case STREAM_TYPE_AUDIO: |
|
|
|
|
case STREAM_TYPE_VIDEO: |
|
|
|
|
case STREAM_TYPE_AUDIO_MPEG1: |
|
|
|
|
case STREAM_TYPE_AUDIO_MPEG2: |
|
|
|
|
case STREAM_TYPE_VIDEO_MPEG1: |
|
|
|
|
case STREAM_TYPE_VIDEO_MPEG2: |
|
|
|
|
add_pes_stream(ts->stream, pid); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
@ -429,7 +431,7 @@ static void pat_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
|
if (sid == 0x0000) { |
|
|
|
|
/* NIT info */ |
|
|
|
|
} else { |
|
|
|
|
if (ts->req_sid == sid) { |
|
|
|
|
if (ts->req_sid == sid || ts->req_sid < 0) { |
|
|
|
|
ts->pmt_filter = mpegts_open_section_filter(ts, pmt_pid,
|
|
|
|
|
pmt_cb, ts, 1); |
|
|
|
|
goto found; |
|
|
|
@ -861,28 +863,32 @@ static int mpegts_read_header(AVFormatContext *s, |
|
|
|
|
ts->auto_guess = 0; |
|
|
|
|
|
|
|
|
|
if (!ts->auto_guess) { |
|
|
|
|
int sid = -1; |
|
|
|
|
ts->set_service_ret = -1; |
|
|
|
|
|
|
|
|
|
/* first do a scaning to get all the services */ |
|
|
|
|
url_fseek(pb, pos, SEEK_SET); |
|
|
|
|
mpegts_scan_sdt(ts); |
|
|
|
|
|
|
|
|
|
handle_packets(s, MAX_SCAN_PACKETS); |
|
|
|
|
|
|
|
|
|
/* if no service found, no need to do anything */ |
|
|
|
|
if (ts->nb_services <= 0) |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
/* now find the info for the first service */ |
|
|
|
|
|
|
|
|
|
url_fseek(pb, pos, SEEK_SET); |
|
|
|
|
service = ts->services[0]; |
|
|
|
|
|
|
|
|
|
if (ts->nb_services > 0) |
|
|
|
|
{ |
|
|
|
|
/* tune to first service found */ |
|
|
|
|
service = ts->services[0]; |
|
|
|
|
sid = service->sid; |
|
|
|
|
#ifdef DEBUG_SI |
|
|
|
|
printf("tuning to '%s'\n", service->name); |
|
|
|
|
printf("tuning to '%s'\n", service->name); |
|
|
|
|
#endif |
|
|
|
|
/* tune to first service found */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* now find the info for the first service if we found any,
|
|
|
|
|
otherwise try to filter all PATs */ |
|
|
|
|
|
|
|
|
|
url_fseek(pb, pos, SEEK_SET); |
|
|
|
|
ts->stream = s; |
|
|
|
|
mpegts_set_service(ts, service->sid, set_service_cb, ts); |
|
|
|
|
|
|
|
|
|
mpegts_set_service(ts, sid, set_service_cb, ts); |
|
|
|
|
|
|
|
|
|
handle_packets(s, MAX_SCAN_PACKETS); |
|
|
|
|
|
|
|
|
|
/* if could not find service, exit */ |
|
|
|
|