From 9fce0ed5dd37daa6d98d0a4aaed05faafb2e6771 Mon Sep 17 00:00:00 2001 From: Andreas Oberritter Date: Wed, 21 Mar 2012 15:55:42 +0100 Subject: [PATCH 3/3] mpegpsdemux_speedup.diff --- gst/mpegdemux/gstmpegdemux.c | 52 +++++++++++++++++++++++++++++++++++++----- gst/mpegdemux/gstmpegdemux.h | 4 +++ 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/gst/mpegdemux/gstmpegdemux.c b/gst/mpegdemux/gstmpegdemux.c index 8359285..35a7ee9 100644 --- a/gst/mpegdemux/gstmpegdemux.c +++ b/gst/mpegdemux/gstmpegdemux.c @@ -285,7 +285,10 @@ gst_flups_demux_reset (GstFluPSDemux * demux) if (stream != NULL) { if (stream->pad) gst_element_remove_pad (GST_ELEMENT_CAST (demux), stream->pad); - + if (stream->buf) + free(stream->buf); + if (stream->meta_buf) + gst_buffer_unref(stream->meta_buf); g_free (stream); demux->streams[i] = NULL; } @@ -415,6 +418,15 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type) stream->type = stream_type; stream->pad = gst_pad_new_from_template (template, name); stream->segment_thresh = threshold; + + if (threshold == VIDEO_SEGMENT_THRESHOLD) { + stream->buf = malloc(64*1024); + stream->buf_pos = 0; + stream->meta_buf = gst_buffer_new(); + } + else + stream->buf = 0; + gst_pad_set_event_function (stream->pad, GST_DEBUG_FUNCPTR (gst_flups_demux_src_event)); gst_pad_set_query_function (stream->pad, @@ -466,6 +478,7 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream, GstFlowReturn result; guint64 timestamp; guint size; + gboolean sent = FALSE; if (stream == NULL) goto no_stream; @@ -568,11 +581,38 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream, demux->next_pts = G_MAXUINT64; demux->next_dts = G_MAXUINT64; - result = gst_pad_push (stream->pad, buf); - GST_DEBUG_OBJECT (demux, "pushed stream id 0x%02x type 0x%02x, time: %" - GST_TIME_FORMAT ", size %d. result: %s", - stream->id, stream->type, GST_TIME_ARGS (timestamp), - size, gst_flow_get_name (result)); + if (stream->buf && stream->buf_pos && (timestamp != GST_CLOCK_TIME_NONE || stream->buf_pos+size > 64*1024)) { + GstBuffer *tmp = gst_buffer_new_and_alloc(stream->buf_pos); + gst_buffer_copy_metadata(tmp, stream->meta_buf, GST_BUFFER_COPY_ALL); + GST_BUFFER_SIZE(tmp) = stream->buf_pos; + memcpy(GST_BUFFER_DATA(tmp), stream->buf, stream->buf_pos); + result = gst_pad_push (stream->pad, tmp); + GST_DEBUG_OBJECT (demux, "pushed stream id 0x%02x type 0x%02x, time: %" + GST_TIME_FORMAT ", size %d. result: %s", + stream->id, stream->type, GST_TIME_ARGS (timestamp), + stream->buf_pos, gst_flow_get_name (result)); + stream->buf_pos = 0; + sent = TRUE; + } + + if (!stream->buf || size > 64*1024) { + result = gst_pad_push (stream->pad, buf); + GST_DEBUG_OBJECT (demux, "pushed stream id 0x%02x type 0x%02x, time: %" + GST_TIME_FORMAT ", size %d. result: %s", + stream->id, stream->type, GST_TIME_ARGS (timestamp), + size, gst_flow_get_name (result)); + } + else { + if (!stream->buf_pos) + gst_buffer_copy_metadata(stream->meta_buf, buf, GST_BUFFER_COPY_ALL); + + memcpy(stream->buf + stream->buf_pos, GST_BUFFER_DATA(buf), size); + stream->buf_pos += size; + gst_buffer_unref(buf); + + if (!sent) + result = GST_FLOW_OK; + } return result; diff --git a/gst/mpegdemux/gstmpegdemux.h b/gst/mpegdemux/gstmpegdemux.h index 6cf7aed..5977578 100644 --- a/gst/mpegdemux/gstmpegdemux.h +++ b/gst/mpegdemux/gstmpegdemux.h @@ -92,6 +92,10 @@ struct _GstFluPSStream gboolean discont; gboolean notlinked; gboolean need_segment; + + GstBuffer *meta_buf; + unsigned char *buf; + size_t buf_pos; }; struct _GstFluPSDemux -- 1.7.5.4