summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2009-09-19 00:21:48 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2009-09-19 00:21:48 +0800
commit22437647591de94ddcac57f2a71de70366eee71e (patch)
treed7599de970d52bf4a456151905e93f2a71b3f0a3
parent78987c966cf63edbc07150e268bef31bc1148f5a (diff)
pmpdemux: set dela_unit flags for non-key-frames
-rw-r--r--src/gstpmpdemux.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/src/gstpmpdemux.c b/src/gstpmpdemux.c
index 09503ba..664c7ae 100644
--- a/src/gstpmpdemux.c
+++ b/src/gstpmpdemux.c
@@ -433,22 +433,29 @@ static gboolean
gst_pmpdemux_perform_seek (GstPmpdemux * pmpdemux, GstSegment * segment)
{
gint64 desired_offset;
- guint index;
guint n;
desired_offset = segment->last_stop;
- index = gst_util_uint64_scale (desired_offset, pmpdemux->timerate,
- pmpdemux->timescale * GST_SECOND);
- /* seek to previous keyframe */
- while (index > 0 && !(pmpdemux->samples[index].size & 1))
- index--;
+ GST_DEBUG_OBJECT (pmpdemux, "seeking to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (desired_offset));
- desired_offset = gst_util_uint64_scale (index * pmpdemux->timescale, GST_SECOND,
- pmpdemux->timerate);
+ if (segment->flags & GST_SEEK_FLAG_KEY_UNIT) {
+ guint index;
- GST_DEBUG_OBJECT (pmpdemux, "seeking to %" GST_TIME_FORMAT "sample @%u",
- GST_TIME_ARGS (desired_offset), index);
+ index = gst_util_uint64_scale (desired_offset, pmpdemux->timerate,
+ pmpdemux->timescale * GST_SECOND);
+
+ /* seek to previous keyframe */
+ while (index > 0 && !(pmpdemux->samples[index].size & 1))
+ index--;
+
+ desired_offset = gst_util_uint64_scale (index * pmpdemux->timescale, GST_SECOND,
+ pmpdemux->timerate);
+
+ GST_DEBUG_OBJECT (pmpdemux, "keyframe seek, align to %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (desired_offset));
+ }
/* and set all streams to the final position */
for (n = 0; n < pmpdemux->n_streams; n++) {
@@ -1352,6 +1359,9 @@ gst_pmpdemux_loop_state_frame (GstPmpdemux * pmpdemux)
stream->discont = FALSE;
}
+ if (!(pmpdemux->samples[stream->sample_index].size & 1))
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+
gst_buffer_set_caps (buf, stream->caps);
GST_LOG_OBJECT (pmpdemux,
@@ -1711,6 +1721,9 @@ gst_pmpdemux_chain (GstPad * sinkpad, GstBuffer * inbuf)
GST_BUFFER_TIMESTAMP (buf) = demux->last_ts;
else
GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE;
+
+ if (!(demux->samples[stream->sample_index].size & 1))
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
gst_buffer_set_caps (buf, stream->caps);
GST_LOG_OBJECT (demux,