diff options
author | Luo Jinghua <sunmoon1997@gmail.com> | 2009-09-18 14:35:08 +0800 |
---|---|---|
committer | Luo Jinghua <sunmoon1997@gmail.com> | 2009-09-18 17:41:20 +0800 |
commit | 351c203d216335b77dd88a2350d5f2b7148ee458 (patch) | |
tree | 7eb641c24fb86050b4d0c62584cbff1d549df865 | |
parent | c850eb553b45b79850ec552e2feb56dfa162c33a (diff) |
pmpdemux: don't set the duration of ouput buffers
-rw-r--r-- | src/gstpmpdemux.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/src/gstpmpdemux.c b/src/gstpmpdemux.c index 8698723..ec25500 100644 --- a/src/gstpmpdemux.c +++ b/src/gstpmpdemux.c @@ -925,8 +925,7 @@ gst_pmpdemux_init_streams (GstPmpdemux * pmpdemux) gst_element_no_more_pads (GST_ELEMENT (pmpdemux)); gst_segment_set_duration (&pmpdemux->segment, GST_FORMAT_TIME, pmpdemux->duration); - /* FIXME: why doesn't it works for pull based streams? */ - if (pmpdemux->segment.stop < 0 && pmpdemux->pullbased) + if (pmpdemux->segment.stop < 0) pmpdemux->segment.stop = pmpdemux->duration; } @@ -1108,17 +1107,17 @@ gst_pmpdemux_prepare_current_sample (GstPmpdemux * pmpdemux, frame->offset = position; frame->offset += PMP_FRAME_HEADER_SIZE; - frame->offset += 4 * frame->n_audio_frames * pmpdemux->n_audio_streams; + frame->offset += 4 * frame->n_audio_frames * pmpdemux->header.audio.n_streams; if (index) { ret = gst_pad_pull_range (pmpdemux->sinkpad, position + PMP_FRAME_HEADER_SIZE, - 4 * frame->n_audio_frames * pmpdemux->n_audio_streams, + 4 * frame->n_audio_frames * pmpdemux->header.audio.n_streams, &buf); if (ret != GST_FLOW_OK) goto eos; data = GST_BUFFER_DATA (buf); - for (n = 0; n < frame->n_audio_frames * pmpdemux->n_audio_streams; n++) + for (n = 0; n < frame->n_audio_frames * pmpdemux->header.audio.n_streams; n++) frame->frames_len[n] = GST_READ_UINT32_LE (data + n * 4); gst_buffer_unref (buf); } @@ -1341,7 +1340,6 @@ gst_pmpdemux_loop_state_frame (GstPmpdemux * pmpdemux) goto next; GST_BUFFER_TIMESTAMP (buf) = timestamp; - GST_BUFFER_DURATION (buf) = duration; GST_BUFFER_OFFSET (buf) = -1; GST_BUFFER_OFFSET_END (buf) = -1; @@ -1605,7 +1603,7 @@ gst_pmpdemux_chain (GstPad * sinkpad, GstBuffer * inbuf) g_free (data); demux->offset += demux->neededbytes; - demux->neededbytes = 4 * frame->n_audio_frames * demux->n_audio_streams; + demux->neededbytes = 4 * frame->n_audio_frames * demux->header.audio.n_streams; demux->state = PMPDEMUX_STATE_FRAME_AUDIO_HEADER; GST_DEBUG_OBJECT (demux, "frame: n_audio_frames %d video_len %d", @@ -1622,7 +1620,7 @@ gst_pmpdemux_chain (GstPad * sinkpad, GstBuffer * inbuf) demux->offset); data = gst_adapter_take (demux->adapter, demux->neededbytes); - for (i = 0; i < frame->n_audio_frames * demux->n_audio_streams; i++) { + for (i = 0; i < frame->n_audio_frames * demux->header.audio.n_streams; i++) { frame->frames_len[i] = GST_READ_UINT32_LE (data + i * 4); audio_len += frame->frames_len[i]; } @@ -1680,7 +1678,6 @@ gst_pmpdemux_chain (GstPad * sinkpad, GstBuffer * inbuf) demux->last_ts = gst_util_uint64_scale (index * demux->timescale, GST_SECOND, demux->timerate); GST_BUFFER_TIMESTAMP (outbuf) = demux->last_ts; - GST_BUFFER_DURATION (outbuf) = demux->duration; /* position reporting */ gst_segment_set_last_stop (&demux->segment, GST_FORMAT_TIME, @@ -1703,13 +1700,14 @@ gst_pmpdemux_chain (GstPad * sinkpad, GstBuffer * inbuf) size = frame->frames_len[(i - 1) * frame->n_audio_frames + j]; buf = gst_buffer_create_sub (outbuf, offset, size); + buf = gst_buffer_make_metadata_writable (buf); if (buf) { stream = demux->streams[i]; if (stream->pad && gst_pad_is_linked (stream->pad)) { - GST_BUFFER_TIMESTAMP (buf) = demux->last_ts; - GST_BUFFER_DURATION (buf) = demux->duration; - GST_BUFFER_OFFSET (buf) = -1; - GST_BUFFER_OFFSET_END (buf) = -1; + if (j == 0) + GST_BUFFER_TIMESTAMP (buf) = demux->last_ts; + else + GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE; gst_buffer_set_caps (buf, stream->caps); GST_LOG_OBJECT (demux, |