NOTES use -cache 2048 for pipe or network input use -onesegprog 0..7 for multi channel service (MXTV) TODO video support variable frame rate (!14.985fps) stream audio L/R channel select for dual mono stream test monaural stream diff -ur MPlayer-1.0rc2.orig/cfg-common.h MPlayer-1.0rc2/cfg-common.h --- MPlayer-1.0rc2.orig/cfg-common.h 2007-10-08 04:49:33.000000000 +0900 +++ MPlayer-1.0rc2/cfg-common.h 2008-07-02 17:56:12.000000000 +0900 @@ -235,6 +235,7 @@ {"tsfastparse", "-tsfastparse is no longer a valid option.\n", CONF_TYPE_PRINT, CONF_NOCFG ,0,0, NULL }, {"tsprog", &ts_prog, CONF_TYPE_INT, CONF_RANGE, 0, 65534, NULL}, + {"onesegprog", &oneseg_prog, CONF_TYPE_INT, CONF_RANGE, 0, 7, NULL}, #define TS_MAX_PROBE_SIZE 2000000 /* don't forget to change this in libmpdemux/demux_ts.c too */ {"tsprobe", &ts_probe, CONF_TYPE_POSITION, 0, 0, TS_MAX_PROBE_SIZE, NULL}, {"psprobe", &ps_probe, CONF_TYPE_POSITION, 0, 0, TS_MAX_PROBE_SIZE, NULL}, @@ -387,6 +388,7 @@ extern char* sub_stream; extern int demuxer_type, audio_demuxer_type, sub_demuxer_type; extern int ts_prog; +extern int oneseg_prog; extern int ts_keep_broken; extern off_t ts_probe; extern off_t ps_probe; diff -ur MPlayer-1.0rc2.orig/libmpcodecs/ad_faad.c MPlayer-1.0rc2/libmpcodecs/ad_faad.c --- MPlayer-1.0rc2.orig/libmpcodecs/ad_faad.c 2007-10-08 04:49:25.000000000 +0900 +++ MPlayer-1.0rc2/libmpcodecs/ad_faad.c 2008-07-02 17:55:51.000000000 +0900 @@ -149,8 +149,11 @@ } else { mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Decoder init done (%dBytes)!\n", sh->a_in_buffer_len); // XXX: remove or move to debug! mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Negotiated samplerate: %ldHz channels: %d\n", faac_samplerate, faac_channels); +#if 0 sh->channels = faac_channels; if (audio_output_channels <= 2) sh->channels = faac_channels > 1 ? 2 : 1; +#endif + sh->channels = 2; /* XXX 1seg XXX */ sh->samplerate = faac_samplerate; sh->samplesize=2; //sh->o_bps = sh->samplesize*faac_channels*faac_samplerate; @@ -172,6 +175,7 @@ static int aac_sync(sh_audio_t *sh) { int pos = 0; +#if 0 if(!sh->codecdata_len) { if(sh->a_in_buffer_len < sh->a_in_buffer_size){ sh->a_in_buffer_len += @@ -185,6 +189,9 @@ mp_msg(MSGT_DECAUDIO,MSGL_V, "\nAAC SYNC AFTER %d bytes\n", pos); } } +#endif + uninit(sh); /* XXX 1seg XXX */ + init(sh); /* XXX 1seg XXX */ return pos; } diff -ur MPlayer-1.0rc2.orig/libmpdemux/demux_ts.c MPlayer-1.0rc2/libmpdemux/demux_ts.c --- MPlayer-1.0rc2.orig/libmpdemux/demux_ts.c 2007-10-08 04:49:33.000000000 +0900 +++ MPlayer-1.0rc2/libmpdemux/demux_ts.c 2008-07-02 17:56:52.000000000 +0900 @@ -58,6 +58,7 @@ #define TYPE_VIDEO 2 int ts_prog; +int oneseg_prog; int ts_keep_broken=0; off_t ts_probe = 0; extern char *dvdsub_lang, *audio_lang; //for -alang @@ -503,6 +504,20 @@ return -1; } +static inline int32_t prog_pcr_pid(ts_priv_t *priv, int progid) +{ + int i; + + if(priv->pmt == NULL) + return -1; + for(i=0; i < priv->pmt_cnt; i++) + { + if(priv->pmt[i].progid == progid) + return priv->pmt[i].PCR_PID; + } + return -1; +} + static inline int pid_match_lang(ts_priv_t *priv, uint16_t pid, char *lang) { @@ -1032,6 +1047,7 @@ start_pos = (start_pos <= priv->ts.packet_size ? 0 : start_pos - priv->ts.packet_size); demuxer->movi_start = start_pos; + demuxer->reference_clock = MP_NOPTS_VALUE; stream_reset(demuxer->stream); stream_seek(demuxer->stream, start_pos); //IF IT'S FROM A PIPE IT WILL FAIL, BUT WHO CARES? @@ -2721,11 +2737,38 @@ //c==0 is allowed! if(c > 0) { - rap_flag = (stream_read_char(stream) & 0x40) >> 6; + uint8_t pcrbuf[188]; + int flags = stream_read_char(stream); + int has_pcr; + rap_flag = (flags & 0x40) >> 6; + has_pcr = flags & 0x10; + buf_size--; - c--; - stream_skip(stream, c); + stream_read(stream, pcrbuf, c); + + if(has_pcr) + { + int pcr_pid = prog_pcr_pid(priv, priv->prog); + if(pcr_pid == pid) + { + uint64_t pcr, pcr_ext; + + pcr = (int64_t)(pcrbuf[0]) << 25; + pcr |= pcrbuf[1] << 17 ; + pcr |= (pcrbuf[2]) << 9; + pcr |= pcrbuf[3] << 1 ; + pcr |= (pcrbuf[4] & 0x80) >> 7; + + pcr_ext = (pcrbuf[4] & 0x01) << 8; + pcr_ext |= pcrbuf[5]; + + pcr = pcr * 300 + pcr_ext; + + demuxer->reference_clock = (double)pcr/(double)27000000.0; + } + } + buf_size -= c; if(buf_size == 0) continue; @@ -2905,7 +2948,7 @@ else { progid = prog_id_in_pat(priv, pid); - if(progid != -1) + if(progid != -1 || pid == 0x1fc8 + oneseg_prog /* XXX 1seg XXX */) { if(pid != demuxer->video->id && pid != demuxer->audio->id && pid != demuxer->sub->id) { @@ -3039,8 +3082,9 @@ extern void skip_audio_frame(sh_audio_t *sh_audio); -static void reset_fifos(ts_priv_t* priv, int a, int v, int s) +static void reset_fifos(demuxer_t *demuxer, int a, int v, int s) { + ts_priv_t* priv = demuxer->priv; if(a) { if(priv->fifo[0].pack != NULL) @@ -3070,6 +3114,7 @@ } priv->fifo[2].offset = 0; } + demuxer->reference_clock = MP_NOPTS_VALUE; } @@ -3087,7 +3132,7 @@ //================= seek in MPEG-TS ========================== ts_dump_streams(demuxer->priv); - reset_fifos(priv, sh_audio != NULL, sh_video != NULL, demuxer->sub->id > 0); + reset_fifos(demuxer, sh_audio != NULL, sh_video != NULL, demuxer->sub->id > 0); if(sh_audio != NULL) @@ -3164,7 +3209,7 @@ break; else //H264 { - if((i & ~0x60) == 0x105) break; + if((i & ~0x60) == 0x105 || (i & ~0x60) == 0x107) break; } if(!i || !skip_video_packet(d_video)) break; // EOF? @@ -3233,7 +3278,7 @@ n = *((int*)arg); if(n == -2) { - reset_fifos(priv, areset, vreset, 0); + reset_fifos(demuxer, areset, vreset, 0); ds->id = -2; ds->sh = NULL; ds_free_packs(ds); @@ -3275,7 +3320,7 @@ if(sh) { if(ds->id != priv->ts.streams[i].id) - reset_fifos(priv, areset, vreset, 0); + reset_fifos(demuxer, areset, vreset, 0); ds->id = priv->ts.streams[i].id; ds->sh = sh; ds_free_packs(ds); diff -ur MPlayer-1.0rc2.orig/libmpdemux/demuxer.c MPlayer-1.0rc2/libmpdemux/demuxer.c --- MPlayer-1.0rc2.orig/libmpdemux/demuxer.c 2007-10-08 04:49:33.000000000 +0900 +++ MPlayer-1.0rc2/libmpdemux/demuxer.c 2008-07-02 17:55:51.000000000 +0900 @@ -190,6 +190,7 @@ memset(d,0,sizeof(demuxer_t)); d->stream=stream; d->stream_pts = MP_NOPTS_VALUE; + d->reference_clock = MP_NOPTS_VALUE; d->movi_start=stream->start_pos; d->movi_end=stream->end_pos; d->seekable=1; @@ -376,6 +377,7 @@ // return value: // 0 = EOF // 1 = succesfull +#define MAX_ACUMULATED_PACKETS 64 int ds_fill_buffer(demux_stream_t *ds){ demuxer_t *demux=ds->demuxer; if(ds->current) free_demux_packet(ds->current); @@ -388,6 +390,13 @@ while(1){ if(ds->packs){ demux_packet_t *p=ds->first; + if(demux->reference_clock != MP_NOPTS_VALUE) { + if((p->pts != MP_NOPTS_VALUE) && (p->pts > demux->reference_clock) + && (ds->packs < MAX_ACUMULATED_PACKETS)) { + if(demux_fill_buffer(demux,ds)) + continue; + } + } // copy useful data: ds->buffer=p->buffer; ds->buffer_pos=0; diff -ur MPlayer-1.0rc2.orig/libmpdemux/demuxer.h MPlayer-1.0rc2/libmpdemux/demuxer.h --- MPlayer-1.0rc2.orig/libmpdemux/demuxer.h 2007-10-08 04:49:33.000000000 +0900 +++ MPlayer-1.0rc2/libmpdemux/demuxer.h 2008-07-02 17:55:51.000000000 +0900 @@ -180,6 +180,7 @@ off_t movi_end; stream_t *stream; double stream_pts; // current stream pts, if applicable (e.g. dvd) + double reference_clock; char *filename; ///< Needed by avs_check_file int synced; // stream synced (used by mpeg) int type; // demuxer type: mpeg PS, mpeg ES, avi, avi-ni, avi-nini, asf diff -ur MPlayer-1.0rc2.orig/libmpdemux/mpeg_hdr.c MPlayer-1.0rc2/libmpdemux/mpeg_hdr.c --- MPlayer-1.0rc2.orig/libmpdemux/mpeg_hdr.c 2007-10-08 04:49:33.000000000 +0900 +++ MPlayer-1.0rc2/libmpdemux/mpeg_hdr.c 2008-07-02 17:55:51.000000000 +0900 @@ -320,7 +320,10 @@ } if((timing=getbits(buf, n++, 1))) { +#if 0 picture->timeinc_unit = (getbits(buf, n, 8) << 24) | (getbits(buf, n+8, 8) << 16) | (getbits(buf, n+16, 8) << 8) | getbits(buf, n+24, 8); +#endif + picture->timeinc_unit = 2002; /* XXX 1seg XXX */ n += 32; picture->timeinc_resolution = (getbits(buf, n, 8) << 24) | (getbits(buf, n+8, 8) << 16) | (getbits(buf, n+16, 8) << 8) | getbits(buf, n+24, 8);