flvmux: Correctly offset timestamp

The previous method would break AV sync in the case audio or video
didn't start at the same point in running time.

https://bugzilla.gnome.org/show_bug.cgi?id=731352
This commit is contained in:
Nicolas Dufresne 2014-08-27 21:07:26 -04:00
parent aa5bd99127
commit a7a3cb343a
2 changed files with 11 additions and 6 deletions

View file

@ -253,6 +253,7 @@ gst_flv_mux_reset (GstElement * element)
mux->have_audio = mux->have_video = FALSE;
mux->duration = GST_CLOCK_TIME_NONE;
mux->new_tags = FALSE;
mux->first_timestamp = GST_CLOCK_TIME_NONE;
mux->state = GST_FLV_MUX_STATE_HEADER;
@ -529,7 +530,6 @@ gst_flv_mux_reset_pad (GstFlvMux * mux, GstFlvPad * cpad, gboolean video)
gst_buffer_unref (cpad->video_codec_data);
cpad->video_codec_data = NULL;
cpad->video_codec = G_MAXUINT;
cpad->first_timestamp = GST_CLOCK_TIME_NONE;
cpad->last_timestamp = 0;
}
@ -1021,11 +1021,11 @@ gst_flv_mux_buffer_to_tag_internal (GstFlvMux * mux, GstBuffer * buffer,
else
cts = 0;
if (!GST_CLOCK_TIME_IS_VALID (cpad->first_timestamp))
cpad->first_timestamp = dts;
/* Timestamp must start at zero */
dts -= cpad->first_timestamp;
if (GST_CLOCK_TIME_IS_VALID (mux->first_timestamp)) {
dts -= mux->first_timestamp / GST_MSECOND;
pts = dts + cts;
}
GST_LOG_OBJECT (mux, "got pts %i dts %i cts %i\n", pts, dts, cts);
@ -1502,6 +1502,11 @@ gst_flv_mux_handle_buffer (GstCollectPads * pads, GstCollectData * cdata,
if (ret != GST_FLOW_OK)
return ret;
mux->state = GST_FLV_MUX_STATE_DATA;
if (GST_BUFFER_DTS_IS_VALID (buffer))
mux->first_timestamp = GST_BUFFER_DTS (buffer);
else
mux->first_timestamp = 0;
}
if (mux->new_tags) {

View file

@ -53,7 +53,6 @@ typedef struct
GstBuffer *video_codec_data;
GstClockTime last_timestamp;
GstClockTime first_timestamp;
} GstFlvPad;
typedef enum
@ -79,6 +78,7 @@ typedef struct _GstFlvMux {
GList *index;
guint64 byte_count;
guint64 duration;
GstClockTime first_timestamp;
} GstFlvMux;
typedef struct _GstFlvMuxClass {