# HG changeset patch # User nicodvb # Date 1111477500 0 # Node ID 293d3dee2eae273be47c8de7ebc3a13e1510e395 # Parent 5dcb5fb546a63b7a11cef5ab2bc119814f0a4d77 SL payloads are pushed to audio and video fifo only when they are flagged with random_accesspoint or access_unit_start diff -r 5dcb5fb546a6 -r 293d3dee2eae libmpdemux/demux_ts.c --- a/libmpdemux/demux_ts.c Mon Mar 21 22:08:09 2005 +0000 +++ b/libmpdemux/demux_ts.c Tue Mar 22 07:45:00 2005 +0000 @@ -89,6 +89,7 @@ int pid; char lang[4]; int last_cc; // last cc code (-1 if first packet) + int is_synced; ts_section_t section; struct { uint8_t au_start, au_end, last_au_end; @@ -777,6 +778,7 @@ priv->ts.pids[i]->payload_size = 0; priv->ts.pids[i]->pts = priv->ts.pids[i]->last_pts = 0; priv->ts.pids[i]->last_cc = -1; + priv->ts.pids[i]->is_synced = 0; } } @@ -956,7 +958,7 @@ int deg_flag = 0; mp4_es_descr_t *es = NULL; mp4_sl_config_t *sl = NULL; - uint8_t au_start = 0, au_end = 0, ocr_flag = 0, random_accesspoint = 0, random_accesspoint_only = 0, + uint8_t au_start = 0, au_end = 0, rap_flag = 0, ocr_flag = 0, random_accesspoint = 0, random_accesspoint_only = 0, padding = 0, padding_bits = 0, use_ts = 0, idle = 0, duration = 0; if(! pmt || ! is_aligned || !packet_len) //FIXME @@ -1016,7 +1018,7 @@ if(idle || (padding && !padding_bits)) { - //pes_es->payload_size = 0; + pes_es->payload_size = 0; return -1; } @@ -1043,7 +1045,11 @@ uint64_t dts, cts; if(sl->random_accesspoint) - n++; + rap_flag = getbits(buf, n++, 1); + + if((rap_flag || sl->random_accesspoint_only) || (!sl->random_accesspoint && !sl->random_accesspoint_only)) + pes_es->is_synced = 1; + n += sl->au_seqnum_len; if(packet_len * 8 <= n+8) return -1; @@ -1106,10 +1112,11 @@ pes_es->payload_size -= min(m, pes_es->payload_size); if(0 < pl_size && pl_size < pes_es->payload_size) pes_es->payload_size = pl_size; - //pes_es->sl.size = pes_es->payload_size; - mp_msg(MSGT_DEMUXER,MSGL_DBG2, "mp4_parse_sl_packet, final n=%d, m=%d, size from pes hdr: %u, size from sl hdr: %d\n", - n, m, pes_es->payload_size, pl_size); + if(pes_es->sl.au_start && pes_es->payload_size) + mp_msg(MSGT_DEMUXER,MSGL_DBG2, "4bytes of payload (%d bytes) %02x %02x %02x %02x \n", pes_es->payload_size, buf[m], buf[m+1], buf[m+2], buf[m+3]); + mp_msg(MSGT_DEMUXER,MSGL_DBG2, "mp4_parse_sl_packet, final n=%d, m=%d, RAP_FLAG: %d, RAP_ALWAYS: %d, size from pes hdr: %u, size from sl hdr: %d\n", + n, m, rap_flag, sl->random_accesspoint_only, pes_es->payload_size, pl_size); return m; } @@ -1914,6 +1921,7 @@ tss->last_cc = -1; tss->type = UNKNOWN; tss->subtype = UNKNOWN; + tss->is_synced = 0; priv->ts.pids[pid] = tss; return tss; @@ -2644,6 +2652,15 @@ len = pes_parse2(p, buf_size, es, pid_type, pmt, pid); es->pid = tss->pid; + tss->is_synced = es->is_synced; + + if(es->type==SL_PES_STREAM && !tss->is_synced) + { + if(probe) + return 0; + else + continue; + } if(probe) { @@ -2734,7 +2751,7 @@ { uint16_t sz; - if(tss->type == UNKNOWN) + if((tss->type == UNKNOWN) || (tss->type==SL_PES_STREAM && !tss->is_synced)) { stream_skip(stream, buf_size+junk); if(probe) @@ -2911,6 +2928,9 @@ #endif stream_seek(demuxer->stream, newpos); + for(i = 0; i < 8192; i++) + if(priv->ts.pids[i] != NULL) + priv->ts.pids[i]->is_synced = 0; videobuf_code_len = 0;