mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
flvmux: Correctly mark buffers as delta units
Mark video interframes, video codec data buffers and audio buffers (if it's not an audio-only stream) as delta units.
This commit is contained in:
parent
9fdecbc1c1
commit
c69c5cb0d7
1 changed files with 26 additions and 11 deletions
|
@ -867,8 +867,8 @@ gst_flv_mux_create_metadata (GstFlvMux * mux)
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstBuffer *
|
static GstBuffer *
|
||||||
gst_flv_mux_buffer_to_tag_internal (GstBuffer * buffer, GstFlvPad * cpad,
|
gst_flv_mux_buffer_to_tag_internal (GstFlvMux * mux, GstBuffer * buffer,
|
||||||
gboolean is_codec_data)
|
GstFlvPad * cpad, gboolean is_codec_data)
|
||||||
{
|
{
|
||||||
GstBuffer *tag;
|
GstBuffer *tag;
|
||||||
guint8 *data;
|
guint8 *data;
|
||||||
|
@ -951,6 +951,12 @@ gst_flv_mux_buffer_to_tag_internal (GstBuffer * buffer, GstFlvPad * cpad,
|
||||||
GST_WRITE_UINT32_BE (data + size - 4, size - 4);
|
GST_WRITE_UINT32_BE (data + size - 4, size - 4);
|
||||||
|
|
||||||
gst_buffer_copy_metadata (tag, buffer, GST_BUFFER_COPY_TIMESTAMPS);
|
gst_buffer_copy_metadata (tag, buffer, GST_BUFFER_COPY_TIMESTAMPS);
|
||||||
|
/* mark the buffer if it's an audio buffer and there's also video being muxed
|
||||||
|
* or it's a video interframe */
|
||||||
|
if ((mux->have_video && !cpad->video) ||
|
||||||
|
GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT))
|
||||||
|
GST_BUFFER_FLAG_SET (tag, GST_BUFFER_FLAG_DELTA_UNIT);
|
||||||
|
|
||||||
GST_BUFFER_OFFSET (tag) = GST_BUFFER_OFFSET_END (tag) =
|
GST_BUFFER_OFFSET (tag) = GST_BUFFER_OFFSET_END (tag) =
|
||||||
GST_BUFFER_OFFSET_NONE;
|
GST_BUFFER_OFFSET_NONE;
|
||||||
|
|
||||||
|
@ -958,15 +964,17 @@ gst_flv_mux_buffer_to_tag_internal (GstBuffer * buffer, GstFlvPad * cpad,
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline GstBuffer *
|
static inline GstBuffer *
|
||||||
gst_flv_mux_buffer_to_tag (GstBuffer * buffer, GstFlvPad * cpad)
|
gst_flv_mux_buffer_to_tag (GstFlvMux * mux, GstBuffer * buffer,
|
||||||
|
GstFlvPad * cpad)
|
||||||
{
|
{
|
||||||
return gst_flv_mux_buffer_to_tag_internal (buffer, cpad, FALSE);
|
return gst_flv_mux_buffer_to_tag_internal (mux, buffer, cpad, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline GstBuffer *
|
static inline GstBuffer *
|
||||||
gst_flv_mux_codec_data_buffer_to_tag (GstBuffer * buffer, GstFlvPad * cpad)
|
gst_flv_mux_codec_data_buffer_to_tag (GstFlvMux * mux, GstBuffer * buffer,
|
||||||
|
GstFlvPad * cpad)
|
||||||
{
|
{
|
||||||
return gst_flv_mux_buffer_to_tag_internal (buffer, cpad, TRUE);
|
return gst_flv_mux_buffer_to_tag_internal (mux, buffer, cpad, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1010,24 +1018,31 @@ gst_flv_mux_write_header (GstFlvMux * mux)
|
||||||
"output might not be playable");
|
"output might not be playable");
|
||||||
else
|
else
|
||||||
video_codec_data =
|
video_codec_data =
|
||||||
gst_flv_mux_codec_data_buffer_to_tag (cpad->video_codec_data, cpad);
|
gst_flv_mux_codec_data_buffer_to_tag (mux, cpad->video_codec_data,
|
||||||
|
cpad);
|
||||||
} else if (cpad && !cpad->video && cpad->audio_codec == 10) {
|
} else if (cpad && !cpad->video && cpad->audio_codec == 10) {
|
||||||
if (cpad->audio_codec_data == NULL)
|
if (cpad->audio_codec_data == NULL)
|
||||||
GST_WARNING_OBJECT (mux, "Codec data for audio stream not found, "
|
GST_WARNING_OBJECT (mux, "Codec data for audio stream not found, "
|
||||||
"output might not be playable");
|
"output might not be playable");
|
||||||
else
|
else
|
||||||
audio_codec_data =
|
audio_codec_data =
|
||||||
gst_flv_mux_codec_data_buffer_to_tag (cpad->audio_codec_data, cpad);
|
gst_flv_mux_codec_data_buffer_to_tag (mux, cpad->audio_codec_data,
|
||||||
|
cpad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mark buffers that will go in the streamheader */
|
/* mark buffers that will go in the streamheader */
|
||||||
GST_BUFFER_FLAG_SET (header, GST_BUFFER_FLAG_IN_CAPS);
|
GST_BUFFER_FLAG_SET (header, GST_BUFFER_FLAG_IN_CAPS);
|
||||||
GST_BUFFER_FLAG_SET (metadata, GST_BUFFER_FLAG_IN_CAPS);
|
GST_BUFFER_FLAG_SET (metadata, GST_BUFFER_FLAG_IN_CAPS);
|
||||||
if (video_codec_data != NULL)
|
if (video_codec_data != NULL) {
|
||||||
GST_BUFFER_FLAG_SET (video_codec_data, GST_BUFFER_FLAG_IN_CAPS);
|
GST_BUFFER_FLAG_SET (video_codec_data, GST_BUFFER_FLAG_IN_CAPS);
|
||||||
if (audio_codec_data != NULL)
|
/* mark as a delta unit, so downstream will not try to synchronize on that
|
||||||
|
* buffer - to actually start playback you need a real video keyframe */
|
||||||
|
GST_BUFFER_FLAG_SET (video_codec_data, GST_BUFFER_FLAG_DELTA_UNIT);
|
||||||
|
}
|
||||||
|
if (audio_codec_data != NULL) {
|
||||||
GST_BUFFER_FLAG_SET (audio_codec_data, GST_BUFFER_FLAG_IN_CAPS);
|
GST_BUFFER_FLAG_SET (audio_codec_data, GST_BUFFER_FLAG_IN_CAPS);
|
||||||
|
}
|
||||||
|
|
||||||
/* put buffers in streamheader */
|
/* put buffers in streamheader */
|
||||||
g_value_init (&streamheader, GST_TYPE_ARRAY);
|
g_value_init (&streamheader, GST_TYPE_ARRAY);
|
||||||
|
@ -1103,7 +1118,7 @@ gst_flv_mux_write_buffer (GstFlvMux * mux, GstFlvPad * cpad)
|
||||||
if (!mux->is_live)
|
if (!mux->is_live)
|
||||||
gst_flv_mux_update_index (mux, buffer, cpad);
|
gst_flv_mux_update_index (mux, buffer, cpad);
|
||||||
|
|
||||||
tag = gst_flv_mux_buffer_to_tag (buffer, cpad);
|
tag = gst_flv_mux_buffer_to_tag (mux, buffer, cpad);
|
||||||
|
|
||||||
gst_buffer_unref (buffer);
|
gst_buffer_unref (buffer);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue