From 1854fd19a988e196cf645e1d1d807c77671a936a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 10 Oct 2008 16:33:36 +0000 Subject: gst/flv/gstflvparse.c: Use gst_pad_alloc_buffer_and_set_caps() to make sure we get a buffer with caps that we can wor... Original commit message from CVS: * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Use gst_pad_alloc_buffer_and_set_caps() to make sure we get a buffer with caps that we can work with (i.e. the pad's caps). Add non-keyframe video frames to the index too but without the keyframe flag. Add audio frames to the index only if we have no video stream. --- gst/flv/gstflvparse.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) (limited to 'gst') diff --git a/gst/flv/gstflvparse.c b/gst/flv/gstflvparse.c index 1a4e53cc..16c83ec3 100644 --- a/gst/flv/gstflvparse.c +++ b/gst/flv/gstflvparse.c @@ -625,9 +625,10 @@ gst_flv_parse_tag_audio (GstFLVDemux * demux, const guint8 * data, } /* Create buffer from pad */ - ret = gst_pad_alloc_buffer (demux->audio_pad, GST_BUFFER_OFFSET_NONE, - demux->tag_data_size - codec_data, GST_PAD_CAPS (demux->audio_pad), - &buffer); + ret = + gst_pad_alloc_buffer_and_set_caps (demux->audio_pad, + GST_BUFFER_OFFSET_NONE, demux->tag_data_size - codec_data, + GST_PAD_CAPS (demux->audio_pad), &buffer); if (G_UNLIKELY (ret != GST_FLOW_OK)) { GST_WARNING_OBJECT (demux, "failed allocating a %" G_GUINT64_FORMAT " bytes buffer: %s", demux->tag_data_size, gst_flow_get_name (ret)); @@ -675,6 +676,19 @@ gst_flv_parse_tag_audio (GstFLVDemux * demux, const guint8 * data, GST_BUFFER_OFFSET (buffer) = demux->audio_offset++; GST_BUFFER_OFFSET_END (buffer) = demux->audio_offset; + /* Only add audio frames to the index if we have no video */ + if (!demux->has_video) { + if (demux->index) { + GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %" + G_GUINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), + demux->cur_tag_offset); + gst_index_add_association (demux->index, demux->index_id, + GST_ASSOCIATION_FLAG_KEY_UNIT, + GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buffer), + GST_FORMAT_BYTES, demux->cur_tag_offset, NULL); + } + } + if (G_UNLIKELY (demux->audio_need_discont)) { GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); demux->audio_need_discont = FALSE; @@ -909,9 +923,10 @@ gst_flv_parse_tag_video (GstFLVDemux * demux, const guint8 * data, } /* Create buffer from pad */ - ret = gst_pad_alloc_buffer (demux->video_pad, GST_BUFFER_OFFSET_NONE, - demux->tag_data_size - codec_data, GST_PAD_CAPS (demux->video_pad), - &buffer); + ret = + gst_pad_alloc_buffer_and_set_caps (demux->video_pad, + GST_BUFFER_OFFSET_NONE, demux->tag_data_size - codec_data, + GST_PAD_CAPS (demux->video_pad), &buffer); if (G_UNLIKELY (ret != GST_FLOW_OK)) { GST_WARNING_OBJECT (demux, "failed allocating a %" G_GUINT64_FORMAT " bytes buffer: %s", demux->tag_data_size, gst_flow_get_name (ret)); @@ -961,6 +976,15 @@ gst_flv_parse_tag_video (GstFLVDemux * demux, const guint8 * data, if (!keyframe) { GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); + if (demux->index) { + GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %" + G_GUINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), + demux->cur_tag_offset); + gst_index_add_association (demux->index, demux->index_id, + GST_ASSOCIATION_FLAG_NONE, + GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buffer), + GST_FORMAT_BYTES, demux->cur_tag_offset, NULL); + } } else { if (demux->index) { GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %" -- cgit v1.2.1