mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 01:30:38 +00:00
rsvgdec: use input buffer timings if possible
SVG data may come through multiple buffers, so keep track of the timestamp of the first buffer, and use it in preference. https://bugzilla.gnome.org/show_bug.cgi?id=628284
This commit is contained in:
parent
1ed91ad1db
commit
e323efc353
2 changed files with 34 additions and 9 deletions
|
@ -141,7 +141,7 @@ gst_rsvg_dec_reset (GstRsvgDec * dec)
|
||||||
dec->width = dec->height = 0;
|
dec->width = dec->height = 0;
|
||||||
dec->fps_n = 0;
|
dec->fps_n = 0;
|
||||||
dec->fps_d = 1;
|
dec->fps_d = 1;
|
||||||
dec->timestamp_offset = GST_CLOCK_TIME_NONE;
|
dec->first_timestamp = GST_CLOCK_TIME_NONE;
|
||||||
dec->frame_count = 0;
|
dec->frame_count = 0;
|
||||||
|
|
||||||
gst_segment_init (&dec->segment, GST_FORMAT_UNDEFINED);
|
gst_segment_init (&dec->segment, GST_FORMAT_UNDEFINED);
|
||||||
|
@ -341,11 +341,18 @@ gst_rsvg_dec_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
guint size;
|
guint size;
|
||||||
gboolean ret = GST_FLOW_OK;
|
gboolean ret = GST_FLOW_OK;
|
||||||
|
|
||||||
if (rsvg->timestamp_offset == GST_CLOCK_TIME_NONE) {
|
/* first_timestamp is used slightly differently where a framerate
|
||||||
|
is given or not.
|
||||||
|
If there is a frame rate, it will be used as a base.
|
||||||
|
If there is not, it will be used to keep track of the timestamp
|
||||||
|
of the first buffer, to be used as the timestamp of the output
|
||||||
|
buffer. When a buffer is output, first timestamp will resync to
|
||||||
|
the next buffer's timestamp. */
|
||||||
|
if (rsvg->first_timestamp == GST_CLOCK_TIME_NONE) {
|
||||||
if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
|
if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
|
||||||
rsvg->timestamp_offset = GST_BUFFER_TIMESTAMP (buffer);
|
rsvg->first_timestamp = GST_BUFFER_TIMESTAMP (buffer);
|
||||||
else
|
else if (rsvg->fps_n != 0)
|
||||||
rsvg->timestamp_offset = 0;
|
rsvg->first_timestamp = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_adapter_push (rsvg->adapter, buffer);
|
gst_adapter_push (rsvg->adapter, buffer);
|
||||||
|
@ -377,15 +384,33 @@ gst_rsvg_dec_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
if (rsvg->fps_n != 0) {
|
if (rsvg->first_timestamp != GST_CLOCK_TIME_NONE) {
|
||||||
|
GST_BUFFER_TIMESTAMP (outbuf) = rsvg->first_timestamp;
|
||||||
|
GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE;
|
||||||
|
if (GST_BUFFER_DURATION_IS_VALID (buffer)) {
|
||||||
|
GstClockTime end =
|
||||||
|
GST_BUFFER_TIMESTAMP_IS_VALID (buffer) ?
|
||||||
|
GST_BUFFER_TIMESTAMP (buffer) : rsvg->first_timestamp;
|
||||||
|
end += GST_BUFFER_DURATION (buffer);
|
||||||
|
GST_BUFFER_DURATION (outbuf) = end - GST_BUFFER_TIMESTAMP (outbuf);
|
||||||
|
}
|
||||||
|
if (rsvg->fps_n == 0) {
|
||||||
|
rsvg->first_timestamp = GST_CLOCK_TIME_NONE;
|
||||||
|
} else {
|
||||||
|
GST_BUFFER_DURATION (outbuf) =
|
||||||
|
gst_util_uint64_scale (rsvg->frame_count, rsvg->fps_d,
|
||||||
|
rsvg->fps_n * GST_SECOND);
|
||||||
|
}
|
||||||
|
} else if (rsvg->fps_n != 0) {
|
||||||
GST_BUFFER_TIMESTAMP (outbuf) =
|
GST_BUFFER_TIMESTAMP (outbuf) =
|
||||||
rsvg->timestamp_offset + gst_util_uint64_scale (rsvg->frame_count,
|
rsvg->first_timestamp + gst_util_uint64_scale (rsvg->frame_count,
|
||||||
rsvg->fps_d, rsvg->fps_n * GST_SECOND);
|
rsvg->fps_d, rsvg->fps_n * GST_SECOND);
|
||||||
GST_BUFFER_DURATION (outbuf) =
|
GST_BUFFER_DURATION (outbuf) =
|
||||||
gst_util_uint64_scale (rsvg->frame_count, rsvg->fps_d,
|
gst_util_uint64_scale (rsvg->frame_count, rsvg->fps_d,
|
||||||
rsvg->fps_n * GST_SECOND);
|
rsvg->fps_n * GST_SECOND);
|
||||||
} else {
|
} else {
|
||||||
GST_BUFFER_TIMESTAMP (outbuf) = 0;
|
GST_BUFFER_TIMESTAMP (outbuf) = rsvg->first_timestamp;
|
||||||
|
GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE;
|
||||||
}
|
}
|
||||||
rsvg->frame_count++;
|
rsvg->frame_count++;
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ struct _GstRsvgDec
|
||||||
GstTagList *pending_tags;
|
GstTagList *pending_tags;
|
||||||
|
|
||||||
gint fps_n, fps_d;
|
gint fps_n, fps_d;
|
||||||
GstClockTime timestamp_offset;
|
GstClockTime first_timestamp;
|
||||||
guint64 frame_count;
|
guint64 frame_count;
|
||||||
|
|
||||||
GstSegment segment;
|
GstSegment segment;
|
||||||
|
|
Loading…
Reference in a new issue