summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2009-09-18 14:35:08 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2009-09-18 17:41:20 +0800
commit351c203d216335b77dd88a2350d5f2b7148ee458 (patch)
tree7eb641c24fb86050b4d0c62584cbff1d549df865
parentc850eb553b45b79850ec552e2feb56dfa162c33a (diff)
pmpdemux: don't set the duration of ouput buffers
-rw-r--r--src/gstpmpdemux.c24
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,