Mercurial > libavformat.hg
changeset 160:9bde37b1a5ce libavformat
try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
+ mpegtsenc.c compile fix by me
author | michaelni |
---|---|
date | Sat, 28 Jun 2003 23:44:09 +0000 |
parents | 7d698c3213a0 |
children | e01949598794 |
files | mpegts.c mpegts.h mpegtsenc.c |
diffstat | 3 files changed, 30 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/mpegts.c Wed Jun 25 10:21:45 2003 +0000 +++ b/mpegts.c Sat Jun 28 23:44:09 2003 +0000 @@ -348,7 +348,7 @@ #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 @@ /* 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 @@ 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 @@ 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 */ - + + 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); +#endif + } + + /* now find the info for the first service if we found any, + otherwise try to filter all PATs */ + url_fseek(pb, pos, SEEK_SET); - service = ts->services[0]; -#ifdef DEBUG_SI - printf("tuning to '%s'\n", service->name); -#endif - /* tune to first service found */ 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 */
--- a/mpegts.h Wed Jun 25 10:21:45 2003 +0000 +++ b/mpegts.h Sat Jun 28 23:44:09 2003 +0000 @@ -31,8 +31,10 @@ #define PMT_TID 0x02 #define SDT_TID 0x42 -#define STREAM_TYPE_VIDEO 0x02 -#define STREAM_TYPE_AUDIO 0x03 +#define STREAM_TYPE_VIDEO_MPEG1 0x01 +#define STREAM_TYPE_VIDEO_MPEG2 0x02 +#define STREAM_TYPE_AUDIO_MPEG1 0x03 +#define STREAM_TYPE_AUDIO_MPEG2 0x04 #define STREAM_TYPE_PRIVATE_SECTION 0x05 #define STREAM_TYPE_PRIVATE_DATA 0x06
--- a/mpegtsenc.c Wed Jun 25 10:21:45 2003 +0000 +++ b/mpegtsenc.c Sat Jun 28 23:44:09 2003 +0000 @@ -259,10 +259,10 @@ MpegTSWriteStream *ts_st = st->priv_data; switch(st->codec.codec_type) { case CODEC_TYPE_VIDEO: - stream_type = STREAM_TYPE_VIDEO; + stream_type = STREAM_TYPE_VIDEO_MPEG2; //XXX/FIXME is this (and the define) correct? break; case CODEC_TYPE_AUDIO: - stream_type = STREAM_TYPE_AUDIO; + stream_type = STREAM_TYPE_AUDIO_MPEG1; break; default: stream_type = STREAM_TYPE_PRIVATE_DATA;