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