diff options
author | Luo Jinghua <sunmoon1997@gmail.com> | 2009-09-19 00:21:48 +0800 |
---|---|---|
committer | Luo Jinghua <sunmoon1997@gmail.com> | 2009-09-19 00:21:48 +0800 |
commit | 22437647591de94ddcac57f2a71de70366eee71e (patch) | |
tree | d7599de970d52bf4a456151905e93f2a71b3f0a3 | |
parent | 78987c966cf63edbc07150e268bef31bc1148f5a (diff) |
pmpdemux: set dela_unit flags for non-key-frames
-rw-r--r-- | src/gstpmpdemux.c | 33 |
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, |