--- demux_ts.c 2003-04-12 00:47:40.000000000 +0200 +++ demux_ts_new.c 2003-04-12 00:42:53.000000000 +0200 @@ -66,34 +66,12 @@ #include "config.h" #include "mp_msg.h" #include "help_mp.h" - #include "stream.h" #include "demuxer.h" #include "stheader.h" - #include "bswap.h" -typedef struct { - off_t offset; - long size; - uint8_t type; - uint8_t is_packet_start; - float pts; - uint8_t packet_size; -} ts_payload_t; - - -typedef struct { - float last_audio_pts; - float last_video_pts; - uint8_t just_synced; - uint8_t synced_stream_id; - char *buffer; - int buffer_size; - int buffer_offset; - int packet_size; -} ts_priv_t; #define TS_FEC_PACKET_SIZE 204 #define TS_PACKET_SIZE 188 @@ -104,90 +82,66 @@ #define NUM_CONSECUTIVE_TS_PACKETS 5 -enum MpegTSState { - MPEGTS_HEADER = 0, - MPEGTS_PESHEADER_FILL, - MPEGTS_PESHEADER_FLAGS, - MPEGTS_PESHEADER_SIZE, - MPEGTS_PESHEADER_READ, - MPEGTS_PAYLOAD, - MPEGTS_SKIP, -}; - - int ts_fastparse = 0; typedef enum { - UNKNOWN = -1, + UNKNOWN = -1, VIDEO_MPEG2 = 0x10000002, AUDIO_MP2 = 0x50, AUDIO_A52 = 0x2000, - AUDIO_LPCM_BE = 0x2000000, - SPU_DVD = 0x3000000, - SPU_DVB = 0x3000001, + AUDIO_LPCM_BE = 0x10001 + /*, + SPU_DVD = 0x3000000, + SPU_DVB = 0x3000001, + */ } es_stream_type_t; -typedef struct MpegTSStream // IT'S AN ES -{ + +typedef struct { + int size; + unsigned char *start; + uint16_t payload_size; + es_stream_type_t type; + float pts, last_pts; int pid; - enum MpegTSState state; - int last_cc; /* last cc code (-1 if first packet) */ - /* used to get the format */ - int header_size; - int payload_size; - int pes_header_size; - //AVStream *st; - es_stream_type_t type; - unsigned char header[MAX_HEADER_SIZE]; - char *pes_buffer; - int offset; - float pts; - float last_pts; -} MpegTSStream; + int last_cc; // last cc code (-1 if first packet) +} ES_stream_t; typedef struct MpegTSContext { - int raw_packet_size; /* raw packet size, including FEC if present */ - MpegTSStream *pids[NB_PID_MAX]; - demuxer_t *demuxer; + int packet_size; // raw packet size, including FEC if present e.g. 188 bytes + ES_stream_t *pids[NB_PID_MAX]; } MpegTSContext; typedef struct { - int size; - unsigned char *start; - es_stream_type_t type; - float pts; - int pid; -} ES_info_t; - -MpegTSContext ts; + MpegTSContext ts; +} ts_priv_t; -//FILE *outfile; static uint8_t get_packet_size(const unsigned char *buf, int size) { int i; - if (size < (TS_FEC_PACKET_SIZE * NUM_CONSECUTIVE_TS_PACKETS)) + if(size < (TS_FEC_PACKET_SIZE * NUM_CONSECUTIVE_TS_PACKETS)) return 0; for(i=0; istream)) != 0x47) - && (i < MAX_PROBE_SIZE) - && ! demuxer->stream->eof + && (i < MAX_PROBE_SIZE) + && ! demuxer->stream->eof ) i++; if(c != 0x47) { - mp_msg(MSGT_DEMUX, MSGL_V, "NOT A TS FILE1\n"); - done = 1; - continue; + mp_msg(MSGT_DEMUX, MSGL_V, "NOT A TS FILE1\n"); + done = 1; + continue; } pos = stream_tell(demuxer->stream) - 1; @@ -226,9 +180,9 @@ if(_read < buf_size-1) { - mp_msg(MSGT_DEMUX, MSGL_V, "COULDN'T READ ENOUGH DATA, EXITING TS_CHECK\n"); - stream_reset(demuxer->stream); - return 0; + mp_msg(MSGT_DEMUX, MSGL_V, "COULDN'T READ ENOUGH DATA, EXITING TS_CHECK\n"); + stream_reset(demuxer->stream); + return 0; } size = get_packet_size(buf, buf_size); @@ -242,25 +196,100 @@ } +void ts_detect_streams(demuxer_t *demuxer) +{ + int video_found = 0, audio_found = 0; + off_t pos=0; + ES_stream_t es; + int *apid, *vpid, *spid, fapid, fvpid, fspid; + unsigned char tmp[TS_FEC_PACKET_SIZE]; + sh_video_t *sh_video = demuxer->video->sh; + sh_audio_t *sh_audio = demuxer->audio->sh; + + apid = &(demuxer->audio->id); + vpid = &(demuxer->video->id); + spid = &(demuxer->sub->id); + + + mp_msg(MSGT_DEMUXER, MSGL_INFO, "PROBING UP TO %u\n", MAX_PROBE_SIZE); + while(pos <= MAX_PROBE_SIZE) + { + if(ts_parse(demuxer, &es, tmp)) + { + mp_msg(MSGT_DEMUXER, MSGL_V, "TYPE: %x, PID: %d\n", es.type, es.pid); + if(es.type == VIDEO_MPEG2) + { + sh_video->format = VIDEO_MPEG2; //MPEG2 video + if(*vpid == -1) + *vpid = fvpid = es.pid; + video_found = 1; + } + + if(es.type == AUDIO_MP2) + { + sh_audio->format = AUDIO_MP2; //MPEG1L2 audio + if(*apid == -1) + *apid = fapid = es.pid; + audio_found = 1; + } + + if(es.type == AUDIO_A52) + { + sh_audio->format = AUDIO_A52; //A52 audio + if(*apid == -1) + *apid = fapid = es.pid; + audio_found = 1; + } + + if(es.type == AUDIO_LPCM_BE) //LPCM AUDIO + { + sh_audio->format = AUDIO_LPCM_BE; + if(*apid == -1) + *apid = fapid = es.pid; + audio_found = 1; + } + + pos = stream_tell(demuxer->stream); + if(video_found && audio_found) + break; + } + } + + if(video_found) + mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO MPEG2(pid=%d)...", fvpid); + else + { + *vpid = -2; //WE DIDN'T MATCH ANY VIDEO STREAM, SO WE FORCE THE DEMUXER TO IGNORE VIDEO + mp_msg(MSGT_DEMUXER, MSGL_INFO, "NO VIDEO!\n"); + } + + if(sh_audio->format == AUDIO_MP2) + mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO MP2(pid=%d)\n", fapid); + else if(sh_audio->format == AUDIO_A52) + mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO A52(pid=%d)\n", fapid); + else if(sh_audio->format == AUDIO_LPCM_BE) + mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO LPCM(pid=%d)\n", fapid); + else + { + *apid = -2; //WE DIDN'T MATCH ANY AUDIO STREAM, SO WE FORCE THE DEMUXER TO IGNORE AUDIO + mp_msg(MSGT_DEMUXER, MSGL_INFO, "NO AUDIO!\n"); + } +} demuxer_t *demux_open_ts(demuxer_t * demuxer) { + int i; uint8_t packet_size; - //demuxer_t *vd, *ad; - //stream_t *s; sh_video_t *sh_video; sh_audio_t *sh_audio; - ts_priv_t * priv; - int i; + ts_priv_t * priv = (ts_priv_t*) demuxer->priv; mp_msg(MSGT_DEMUX, MSGL_V, "DEMUX OPEN, AUDIO_ID: %d, VIDEO_ID: %d, SUBTITLE_ID: %d,\n", demuxer->audio->id, demuxer->video->id, demuxer->sub->id); - for(i=0; i < 8192; i++) - ts.pids[i] = NULL; demuxer->type= DEMUXER_TYPE_MPEG_TS; @@ -272,9 +301,12 @@ return NULL; priv = malloc(sizeof(ts_priv_t)); - priv->last_video_pts=-1; - priv->last_audio_pts=-1; - priv->packet_size = packet_size; + + for(i=0; i < 8192; i++) + priv->ts.pids[i] = NULL; + priv->ts.packet_size = packet_size; + + demuxer->priv = priv; if(demuxer->stream->type != STREAMTYPE_FILE) demuxer->seekable=0; @@ -285,8 +317,6 @@ sh_video->ds = demuxer->video; demuxer->video->sh = sh_video; - - sh_audio = new_sh_audio(demuxer, 0); sh_audio->ds = demuxer->audio; demuxer->audio->sh = sh_audio; @@ -302,12 +332,7 @@ demuxer->movi_start = 0; demuxer->movi_end = demuxer->stream->end_pos; */ - - - /* - s= new_ds_stream(demuxer->video); - return demux_open_stream(s, DEMUXER_TYPE_MPEG_ES, demuxer->audio->id, demuxer->video->id, demuxer->sub->id, NULL); - */ + stream_seek(demuxer->stream, 0); //IF IT'S FROM A PIPE IT WILL FAIL, BUT WHO CARES? return demuxer; @@ -315,75 +340,7 @@ -void ts_detect_streams(demuxer_t *demuxer) -{ - int video_found = 0, audio_found = 0; - off_t pos=0; - ES_info_t es; - int *apid, *vpid, *spid; - unsigned char tmp[TS_FEC_PACKET_SIZE]; - sh_video_t *sh_video = demuxer->video->sh; - sh_audio_t *sh_audio = demuxer->audio->sh; - - apid = &(demuxer->audio->id); - vpid = &(demuxer->video->id); - spid = &(demuxer->sub->id); - - - mp_msg(MSGT_DEMUXER, MSGL_INFO, "PROBING UP TO %u\n", MAX_PROBE_SIZE); - while(pos <= MAX_PROBE_SIZE) - { - if(ts_parse(demuxer, &es, tmp)) - { - mp_msg(MSGT_DEMUXER, MSGL_V, "TYPE: %x, PID: %d\n", es.type, es.pid); - if(es.type == VIDEO_MPEG2) - { - sh_video->format = VIDEO_MPEG2; //MPEG2 video - if(*vpid == -1) - *vpid = es.pid; - video_found = 1; - } - - if(es.type == AUDIO_MP2) - { - sh_audio->format = AUDIO_MP2; //MPEG1L2 audio - if(*apid == -1) - *apid = es.pid; - audio_found = 1; - } - - if(es.type == AUDIO_A52) - { - sh_audio->format = AUDIO_A52; //AC3 audio - if(*apid == -1) - *apid = es.pid; - audio_found = 1; - } - - pos = stream_tell(demuxer->stream); - if(video_found && audio_found) - break; - } - } - - if(video_found) - mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO MPEG2..."); - else - { - *vpid = -2; //WE DIDN'T MATCH ANY VIDEO STREAM, SO WE FORCE THE DEMUXER TO IGNORE VIDEO - mp_msg(MSGT_DEMUXER, MSGL_INFO, "NO VIDEO!\n"); - } - - if(sh_audio->format == AUDIO_MP2) - mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO MP2\n"); - else if(sh_audio->format == AUDIO_A52) - mp_msg(MSGT_DEMUXER, MSGL_INFO, "AUDIO A52\n"); - else - { - *apid = -2; //WE DIDN'T MATCH ANY AUDIO STREAM, SO WE FORCE THE DEMUXER TO IGNORE AUDIO - mp_msg(MSGT_DEMUXER, MSGL_INFO, "NO AUDIO!\n"); - } -} + void demux_close_ts(demuxer_t * demuxer) @@ -398,27 +355,26 @@ -//MpegTSStream *tss, const unsigned char *buf, int buf_size, int is_start, ES_info_t *es -static int pes_parse2(MpegTSStream *tss, unsigned char *buf, uint16_t packet_len, int is_start, ES_info_t *es) +static int pes_parse2(unsigned char *buf, uint16_t packet_len, int is_start, ES_stream_t *es) { - unsigned char *p; + unsigned char *p; uint32_t header_len; int64_t pts; uint32_t stream_id; uint32_t pkt_len; - mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2(%X, %X, %d, %d, ): \n", tss, buf, packet_len, is_start); + mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2(%X, %d, %d, ): \n", buf, packet_len, is_start); if(packet_len == 0) { - mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2(,PACKET_LEN = 0, EXIT\n"); - return 0; + mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2(,PACKET_LEN = 0, EXIT\n"); + return 0; } if(packet_len > 184) { - mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2, BUFFER LEN IS TOO BIG: %d, EXIT\n", packet_len); - return 0; + mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2, BUFFER LEN IS TOO BIG: %d, EXIT\n", packet_len); + return 0; } @@ -427,143 +383,151 @@ if(! is_start) { - tss->pts = tss->last_pts; - es->start = p; - es->size = packet_len; - return es->size; + es->pts = 0.0f; + es->start = p; + es->size = packet_len; + return es->size; } /* we should have a PES packet here */ + mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: HEADER %02x %02x %02x %02x\n", p[0], p[1], p[2], p[3]); if (p[0] || p[1] || (p[2] != 1)) { - mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: error HEADER %02x %02x %02x (should be 0x000001) \n", p[0], p[1], p[2]); - return 0 ; + mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: error HEADER %02x %02x %02x (should be 0x000001) \n", p[0], p[1], p[2]); + return 0 ; } packet_len -= 6; - tss->payload_size = p[4] << 8 | p[5]; - if (tss->payload_size == 0) - tss->payload_size = 65536; + es->payload_size = p[4] << 8 | p[5]; + if (es->payload_size == 0) + es->payload_size = 65535; stream_id = p[3]; if(packet_len==0) return 0; - //mp_msg(MSGT_DEMUX, MSGL_V, "pes_parse2: packet stream id: %.2X (%d) len: %d (%x)\n", stream_id, stream_id, packet_len, packet_len); if (p[7] & 0x80) - { /* pts avail */ - pts = (int64_t)(p[9] & 0x0E) << 29 ; - pts |= p[10] << 22 ; - pts |= (p[11] & 0xFE) << 14 ; - pts |= p[12] << 7 ; - pts |= (p[13] & 0xFE) >> 1 ; + { /* pts available */ + pts = (int64_t)(p[9] & 0x0E) << 29 ; + pts |= p[10] << 22 ; + pts |= (p[11] & 0xFE) << 14 ; + pts |= p[12] << 7 ; + pts |= (p[13] & 0xFE) >> 1 ; - tss->pts = tss->last_pts = pts / 90000.0f; + es->pts = pts / 90000.0f; } else - tss->pts = tss->last_pts; + es->pts = 0.0f; header_len = p[8]; /* sometimes corruption on header_len causes segfault in memcpy below */ if (header_len + 9 > pkt_len) { - mp_msg(MSGT_DEMUX, MSGL_DBG2, "demux_ts: illegal value for PES_header_data_length (0x%02x)\n", header_len); - return 0; + mp_msg(MSGT_DEMUX, MSGL_DBG2, "demux_ts: illegal value for PES_header_data_length (0x%02x)\n", header_len); + return 0; } p += header_len + 9; packet_len -= header_len + 3; if (stream_id == 0xbd) - { - int track, spu_id; - - mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: audio buf = %02X %02X %02X %02X %02X %02X %02X %02X\n", - p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); - - track = p[0] & 0x0F; /* hack : ac3 track */ - /* + { + /* hack : ac3 track */ + int track, spu_id; + + mp_msg(MSGT_DEMUX, MSGL_V, "pes_parse2: audio buf = %02X %02X %02X %02X %02X %02X %02X %02X, 80: %d\n", + p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[0] & 0x80); + + track = p[0] & 0x0F; + mp_msg(MSGT_DEMUX, MSGL_DBG2, "AC3 TRACK: %d\n", track); + + + /* * we check the descriptor tag first because some stations * do not include any of the ac3 header info in their audio tracks * these "raw" streams may begin with a byte that looks like a stream type. */ - if( //(m->descriptor_tag == 0x81) || /* ac3 - raw */ - (p[0] == 0x0B && p[1] == 0x77)) /* ac3 - syncword */ - { + if( /* ac3 - raw or syncword */ + (p[0] == 0x0B && p[1] == 0x77)) + { + mp_msg(MSGT_DEMUX, MSGL_DBG2, "AC3 SYNCWORD\n"); es->start = p; es->size = packet_len; - tss->type = AUDIO_A52; + es->type = AUDIO_A52; return es->size; - } - else if (//m->descriptor_tag == 0x06 && + } + /* + else if (//m->descriptor_tag == 0x06 && p[0] == 0x20 && p[1] == 0x00) - { - /* DVBSUB */ + { + // DVBSUB long payload_len = ((buf[4] << 8) | buf[5]) - header_len - 3; es->start = p; es->size = packet_len; - tss->type = SPU_DVB + payload_len; - - return es->size; - } - else if ((p[0] & 0xE0) == 0x20) - { + es->type = SPU_DVB + payload_len; + return es->size; + } + + else if ((p[0] & 0xE0) == 0x20) + { spu_id = (p[0] & 0x1f); es->start = p+1; es->size = packet_len-1; - tss->type = SPU_DVD + spu_id; + es->type = SPU_DVD + spu_id; return es->size; - } - else if ((p[0] & 0xF0) == 0x80) - { + } + */ + else if ((p[0] & 0xF0) == 0x80) + { + mp_msg(MSGT_DEMUX, MSGL_DBG2, "AC3 WITH HEADER\n"); es->start = p+4; es->size = packet_len - 4; - tss->type = AUDIO_A52; // + track; + es->type = AUDIO_A52; return es->size; - } - else if ((p[0]&0xf0) == 0xa0) - { + } + else if ((p[0]&0xf0) == 0xa0) + { int pcm_offset; for (pcm_offset=0; ++pcm_offset < packet_len-1 ; ) { - if (p[pcm_offset] == 0x01 && p[pcm_offset+1] == 0x80) - { /* START */ + if (p[pcm_offset] == 0x01 && p[pcm_offset+1] == 0x80) + { pcm_offset += 2; break; - } + } } es->start = p + pcm_offset; es->size = packet_len - pcm_offset; - tss->type = AUDIO_LPCM_BE; // + track; + es->type = AUDIO_LPCM_BE; return es->size; - } + } } else if ((stream_id >= 0xbc) && ((stream_id & 0xf0) == 0xe0)) { - es->start = p; - es->size = packet_len; - tss->type = VIDEO_MPEG2; - return es->size; + es->start = p; + es->size = packet_len; + es->type = VIDEO_MPEG2; + return es->size; } else if ((stream_id & 0xe0) == 0xc0) { - int track; - track = stream_id & 0x1f; - es->start = p; - es->size = packet_len; - tss->type = AUDIO_MP2; // + track; - return es->size; + int track; + track = stream_id & 0x1f; + es->start = p; + es->size = packet_len; + es->type = AUDIO_MP2; + return es->size; } else { - mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: unknown packet, id: %x\n", stream_id); + mp_msg(MSGT_DEMUX, MSGL_DBG2, "pes_parse2: unknown packet, id: %x\n", stream_id); } return 0; @@ -581,9 +545,9 @@ while(((c=stream_read_char(demuxer->stream)) != 0x47) && ! demuxer->stream->eof); if(c == 0x47) - return c; + return c; else - return 0; + return 0; } @@ -593,96 +557,107 @@ // 0 = EOF or no stream found // 1 = successfully read a packet -int ts_parse(demuxer_t * demuxer , ES_info_t *es, unsigned char *packet) +int ts_parse(demuxer_t * demuxer , ES_stream_t *es, unsigned char *packet) { - MpegTSStream *tss; + ES_stream_t *tss; uint8_t done = 0; - ts_priv_t *priv = demuxer->priv; uint16_t buf_size, is_start; int len, pid, cc, cc_ok, afc; unsigned char *p; + ts_priv_t * priv = (ts_priv_t*) demuxer->priv; + while(! done) { - if(! ts_sync(demuxer)) - { + if(! ts_sync(demuxer)) + { mp_msg(MSGT_DEMUX, MSGL_V, "TS_FILL_BUFFER: COULDN'T SYNC\n"); return 0; - } + } - len = stream_read(demuxer->stream, &packet[1], priv->packet_size-1); - if (len != priv->packet_size-1) - return 0; + len = stream_read(demuxer->stream, &packet[1], priv->ts.packet_size-1); + if (len != priv->ts.packet_size-1) + return 0; - - - pid = ((packet[1] & 0x1f) << 8) | packet[2]; - tss = ts.pids[pid]; //an ES stream - if(tss == NULL) - { - /* if no pid found, then add a pid context */ - tss = malloc(sizeof(MpegTSStream)); - if (!tss) + pid = ((packet[1] & 0x1f) << 8) | packet[2]; + tss = priv->ts.pids[pid]; //an ES stream + if(tss == NULL) + { + tss = malloc(sizeof(ES_stream_t)); + if(! tss) continue; - memset(tss, 0, sizeof(MpegTSStream)); - ts.pids[pid] = tss; - tss->pid = pid; - tss->last_cc = -1; - tss->type = UNKNOWN; - mp_msg(MSGT_DEMUX, MSGL_DBG2, "new TS pid=%u\n", pid); - } - - cc = (packet[3] & 0xf); - cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc)); - if(! cc_ok) - { - mp_msg(MSGT_DEMUX, MSGL_V, "ts_parse: CCCheck NOT OK: %d -> %d\n", tss->last_cc, cc); - } - tss->last_cc = cc; + memset(tss, 0, sizeof(ES_stream_t)); + tss->pid = pid; + tss->last_cc = -1; + tss->type = UNKNOWN; + priv->ts.pids[pid] = tss; + mp_msg(MSGT_DEMUX, MSGL_DBG2, "new TS pid=%u\n", pid); + } + + cc = (packet[3] & 0xf); + cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc)); + if(! cc_ok) + { + mp_msg(MSGT_DEMUX, MSGL_DBG2, "ts_parse: CCCheck NOT OK: %d -> %d\n", tss->last_cc, cc); + } + tss->last_cc = cc; - /* skip adaptation field */ - afc = (packet[3] >> 4) & 3; - p = packet + 4; - if (afc == 0) /* reserved value */ - continue; - if (afc == 2) /* adaptation field only */ - continue; - if (afc == 3) - { - /* skip adapation field */ - p += p[0] + 1; - } - /* if past the end of packet, ignore */ - if (p >= packet + TS_PACKET_SIZE) - continue; - - // PES CONTENT STARTS HERE - - buf_size = TS_PACKET_SIZE - (p - packet); - - is_start = packet[1] & 0x40; - if((len = pes_parse2(tss, p, buf_size, is_start, es))) - { - tss->offset += es->size; + // skip adaptation field + afc = (packet[3] >> 4) & 3; + p = packet + 4; + if (afc == 0) // reserved value + continue; + if (afc == 2) // adaptation field only + continue; + if (afc == 3) + { + // skip adapation field + p += p[0] + 1; + } + // if past the end of packet, ignore + if (p >= packet + TS_PACKET_SIZE) + continue; + + // PES CONTENT STARTS HERE + + buf_size = TS_PACKET_SIZE - (p - packet); + + is_start = packet[1] & 0x40; + len = pes_parse2(p, buf_size, is_start, es); + + if(len) + { es->pid = tss->pid; - es->pts = tss->pts; - es->type = tss->type; + + if(! is_start) + es->type = tss->type; + else + { + tss->type = es->type; + tss->payload_size = es->payload_size; + } + + if(es->pts == 0.0f) + es->pts = tss->pts = tss->last_pts; + else + tss->pts = tss->last_pts = es->pts; - mp_msg(MSGT_DEMUX, MSGL_DBG2, "ts_parse, type=%X, start=%X, len=%d\n", tss->type, es->start, es->size); + mp_msg(MSGT_DEMUX, MSGL_V, "ts_parse, pid=%d, PSIZE: %u, type=%X, start=%X, len=%d\n", es->pid, es->payload_size, es->type, es->start, es->size); return len; - } + } } return 0; } + int demux_ts_fill_buffer(demuxer_t * demuxer) { - ES_info_t es; + ES_stream_t es; demux_packet_t *dp; int len; unsigned char packet[TS_FEC_PACKET_SIZE]; @@ -698,60 +673,62 @@ if(es.type == VIDEO_MPEG2) { - if(ts_fastparse) - { + if(ts_fastparse) + { if(*vpid == -2) continue; if(*vpid == -1) *vpid = es.pid; - } + } - if(*vpid != es.pid) - continue; + if(*vpid != es.pid) + continue; - dp = new_demux_packet(es.size); - if(! dp || ! dp->buffer) - { + dp = new_demux_packet(es.size); + if(! dp || ! dp->buffer) + { fprintf(stderr, "fill_buffer, NEW_ADD_PACKET(%d) FAILED\n", es.size); continue; - } - memcpy(dp->buffer, es.start, es.size); - dp->pts = es.pts; - dp->flags = 0; - dp->pos = stream_tell(demuxer->stream); - ds_add_packet(demuxer->video, dp); - mp_msg(MSGT_DEMUX, MSGL_V, "VIDEO pts=%f\n", es.pts); - return len; + } + memcpy(dp->buffer, es.start, es.size); + dp->pts = es.pts; + dp->flags = 0; + dp->pos = stream_tell(demuxer->stream); + ds_add_packet(demuxer->video, dp); + mp_msg(MSGT_DEMUX, MSGL_V, "VIDEO pts=%f\n", es.pts); + return len; } - if((es.type == AUDIO_MP2) || (es.type == AUDIO_A52)) + if((es.type == AUDIO_MP2) || (es.type == AUDIO_A52) || (es.type == AUDIO_LPCM_BE)) { - if(ts_fastparse) - { + mp_msg(MSGT_DEMUX, MSGL_V, "FILL_AUDIO %x \n", es.type); + + if(ts_fastparse) + { if(*apid == -2) - continue; + continue; if(*apid == -1) - *apid = es.pid; - } + *apid = es.pid; + } - if(*apid != es.pid) - continue; + if(*apid != es.pid) + continue; - dp = new_demux_packet(es.size); - if(! dp || ! dp->buffer) - { - fprintf(stderr, "fill_buffer, NEW_ADD_PACKET(%d) FAILED\n", es.size); - continue; - } - memcpy(dp->buffer, es.start, es.size); - dp->flags = 0; - dp->pts = es.pts; - dp->pos = stream_tell(demuxer->stream); - ds_add_packet(demuxer->audio, dp); - mp_msg(MSGT_DEMUX, MSGL_V, "AUDIO pts=%f\r\n", es.pts); - return len; + dp = new_demux_packet(es.size); + if(! dp || ! dp->buffer) + { + fprintf(stderr, "fill_buffer, NEW_ADD_PACKET(%d) FAILED\n", es.size); + continue; + } + memcpy(dp->buffer, es.start, es.size); + dp->flags = 0; + dp->pts = es.pts; + dp->pos = stream_tell(demuxer->stream); + ds_add_packet(demuxer->audio, dp); + mp_msg(MSGT_DEMUX, MSGL_V, "AUDIO pts=%f\r\n", es.pts); + return len; } mp_msg(MSGT_DEMUX, MSGL_V, "SKIP--------\n"); @@ -767,7 +744,7 @@ uint8_t c = 0, done = 0, i, buf[TS_FEC_PACKET_SIZE * NUM_CONSECUTIVE_TS_PACKETS]; off_t pos; - mp_msg(MSGT_DEMUX, MSGL_DBG2, "STRINGENT_TS_SYNC packet_size: %d\n", priv->packet_size); + mp_msg(MSGT_DEMUX, MSGL_DBG2, "STRINGENT_TS_SYNC packet_size: %d\n", priv->ts.packet_size); if(! demuxer->seekable) @@ -791,12 +768,12 @@ done = 1; buf[0] = c; - stream_read(demuxer->stream, &buf[1], (priv->packet_size * NUM_CONSECUTIVE_TS_PACKETS) - 1); + stream_read(demuxer->stream, &buf[1], (priv->ts.packet_size * NUM_CONSECUTIVE_TS_PACKETS) - 1); for(i = 0; i < 5; i++) { - if (buf[i * priv->packet_size] != 0x47) + if (buf[i * priv->ts.packet_size] != 0x47) done = 0; - mp_msg(MSGT_DEMUX, MSGL_DBG2, "i: %d, char: %x\n", i, buf[i * priv->packet_size]); + mp_msg(MSGT_DEMUX, MSGL_DBG2, "i: %d, char: %x\n", i, buf[i * priv->ts.packet_size]); } if(done) @@ -872,17 +849,6 @@ ds_fill_buffer(d_audio); resync_audio_stream(sh_audio); } - - - /* - * Reset the PTS info inside the ts_priv_t structure. This way we don't deliver - * data with the wrong PTSs (the ones we had before seeking). - * - */ - - - priv->last_video_pts=-1; - priv->last_audio_pts=-1; return 1; }