mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 09:40:37 +00:00
vdpaumpegdec: further work on seeking
This commit is contained in:
parent
d65d4c40f5
commit
702cc4a03f
1 changed files with 27 additions and 34 deletions
|
@ -308,6 +308,9 @@ gst_vdp_mpeg_dec_push_video_buffer (GstVdpMpegDec * mpeg_dec,
|
|||
mpeg_dec->next_timestamp = GST_BUFFER_TIMESTAMP (buffer) +
|
||||
GST_BUFFER_DURATION (buffer);
|
||||
|
||||
gst_segment_set_last_stop (&mpeg_dec->segment, GST_FORMAT_TIME,
|
||||
GST_BUFFER_TIMESTAMP (buffer));
|
||||
|
||||
mpeg_dec->accumulated_duration += GST_BUFFER_DURATION (buffer);
|
||||
mpeg_dec->accumulated_size += GST_BUFFER_SIZE (buffer);
|
||||
byterate = gst_util_uint64_scale (mpeg_dec->accumulated_size, GST_SECOND,
|
||||
|
@ -795,53 +798,46 @@ normal_seek (GstPad * pad, GstEvent * event)
|
|||
GstFormat format, conv;
|
||||
GstSeekFlags flags;
|
||||
GstSeekType cur_type, stop_type;
|
||||
gint64 cur, stop;
|
||||
gint64 time_cur, bytes_cur;
|
||||
gint64 time_stop, bytes_stop;
|
||||
gboolean res;
|
||||
gboolean update;
|
||||
GstEvent *peer_event;
|
||||
|
||||
GST_DEBUG ("normal seek");
|
||||
|
||||
gst_event_parse_seek (event, &rate, &format, &flags,
|
||||
&cur_type, &cur, &stop_type, &stop);
|
||||
&cur_type, &time_cur, &stop_type, &time_stop);
|
||||
|
||||
conv = GST_FORMAT_TIME;
|
||||
if (!gst_vdp_mpeg_dec_convert (mpeg_dec, format, cur, conv, &time_cur))
|
||||
goto convert_failed;
|
||||
if (!gst_vdp_mpeg_dec_convert (mpeg_dec, format, stop, conv, &time_stop))
|
||||
goto convert_failed;
|
||||
if (format != GST_FORMAT_TIME)
|
||||
return FALSE;
|
||||
|
||||
GST_DEBUG ("seek to time %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
|
||||
GST_TIME_ARGS (time_cur), GST_TIME_ARGS (time_stop));
|
||||
gst_segment_set_seek (&mpeg_dec->segment, rate, GST_FORMAT_TIME, flags,
|
||||
cur_type, time_cur, stop_type, time_stop, &update);
|
||||
|
||||
peer_event = gst_event_new_seek (rate, GST_FORMAT_TIME, flags,
|
||||
cur_type, time_cur, stop_type, time_stop);
|
||||
if (update) {
|
||||
|
||||
/* try seek on time then */
|
||||
if ((res = gst_pad_push_event (mpeg_dec->sink, peer_event)))
|
||||
goto done;
|
||||
/* seek on bytes */
|
||||
conv = GST_FORMAT_BYTES;
|
||||
if (!gst_vdp_mpeg_dec_convert (mpeg_dec, GST_FORMAT_TIME, time_cur,
|
||||
conv, &bytes_cur))
|
||||
goto convert_failed;
|
||||
if (!gst_vdp_mpeg_dec_convert (mpeg_dec, GST_FORMAT_TIME, time_stop,
|
||||
conv, &bytes_stop))
|
||||
goto convert_failed;
|
||||
|
||||
/* else we try to seek on bytes */
|
||||
conv = GST_FORMAT_BYTES;
|
||||
if (!gst_vdp_mpeg_dec_convert (mpeg_dec, GST_FORMAT_TIME, time_cur,
|
||||
conv, &bytes_cur))
|
||||
goto convert_failed;
|
||||
if (!gst_vdp_mpeg_dec_convert (mpeg_dec, GST_FORMAT_TIME, time_stop,
|
||||
conv, &bytes_stop))
|
||||
goto convert_failed;
|
||||
/* conversion succeeded, create the seek */
|
||||
peer_event =
|
||||
gst_event_new_seek (rate, GST_FORMAT_BYTES, flags,
|
||||
cur_type, bytes_cur, stop_type, bytes_stop);
|
||||
|
||||
/* conversion succeeded, create the seek */
|
||||
peer_event =
|
||||
gst_event_new_seek (rate, GST_FORMAT_BYTES, flags,
|
||||
cur_type, bytes_cur, stop_type, bytes_stop);
|
||||
mpeg_dec->seeking = TRUE;
|
||||
|
||||
/* do the seek */
|
||||
res = gst_pad_push_event (mpeg_dec->sink, peer_event);
|
||||
/* do the seek */
|
||||
res = gst_pad_push_event (mpeg_dec->sink, peer_event);
|
||||
} else
|
||||
res = FALSE;
|
||||
|
||||
mpeg_dec->seeking = TRUE;
|
||||
|
||||
done:
|
||||
return res;
|
||||
|
||||
/* ERRORS */
|
||||
|
@ -914,9 +910,6 @@ gst_vdp_mpeg_dec_sink_event (GstPad * pad, GstEvent * event)
|
|||
GST_FORMAT_TIME, &position))
|
||||
goto convert_error;
|
||||
|
||||
gst_segment_set_newsegment (&mpeg_dec->segment, update, rate,
|
||||
GST_FORMAT_TIME, start, stop, position);
|
||||
|
||||
gst_event_unref (event);
|
||||
event = gst_event_new_new_segment (update, rate, GST_FORMAT_TIME, start,
|
||||
stop, position);
|
||||
|
|
Loading…
Reference in a new issue