try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)

+ mpegtsenc.c compile fix by me

Originally committed as revision 1995 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2003-06-28 23:44:09 +00:00
parent d3b150363c
commit ce34182dd7
3 changed files with 29 additions and 21 deletions

View File

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

View File

@ -31,8 +31,10 @@
#define PMT_TID 0x02 #define PMT_TID 0x02
#define SDT_TID 0x42 #define SDT_TID 0x42
#define STREAM_TYPE_VIDEO 0x02 #define STREAM_TYPE_VIDEO_MPEG1 0x01
#define STREAM_TYPE_AUDIO 0x03 #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_SECTION 0x05
#define STREAM_TYPE_PRIVATE_DATA 0x06 #define STREAM_TYPE_PRIVATE_DATA 0x06

View File

@ -259,10 +259,10 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
MpegTSWriteStream *ts_st = st->priv_data; MpegTSWriteStream *ts_st = st->priv_data;
switch(st->codec.codec_type) { switch(st->codec.codec_type) {
case CODEC_TYPE_VIDEO: case CODEC_TYPE_VIDEO:
stream_type = STREAM_TYPE_VIDEO; stream_type = STREAM_TYPE_VIDEO_MPEG2; //XXX/FIXME is this (and the define) correct?
break; break;
case CODEC_TYPE_AUDIO: case CODEC_TYPE_AUDIO:
stream_type = STREAM_TYPE_AUDIO; stream_type = STREAM_TYPE_AUDIO_MPEG1;
break; break;
default: default:
stream_type = STREAM_TYPE_PRIVATE_DATA; stream_type = STREAM_TYPE_PRIVATE_DATA;