From 252d4044bf20602c2489243c5f554df9b992d7c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 19 Jan 2008 16:13:31 +0000 Subject: gst/rawparse/gstrawparse.c: Handle framesizes > 4096 with multiple frames per buffer correctly in pull mode and handl... Original commit message from CVS: * gst/rawparse/gstrawparse.c: (gst_raw_parse_push_buffer), (gst_raw_parse_loop): Handle framesizes > 4096 with multiple frames per buffer correctly in pull mode and handle short reads better. Also put offset and offset_end on outgoing buffers. --- ChangeLog | 8 ++++++++ gst/rawparse/gstrawparse.c | 19 ++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 318a6d32..9fe1e004 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-01-19 Sebastian Dröge + + * gst/rawparse/gstrawparse.c: (gst_raw_parse_push_buffer), + (gst_raw_parse_loop): + Handle framesizes > 4096 with multiple frames per buffer correctly + in pull mode and handle short reads better. + Also put offset and offset_end on outgoing buffers. + 2008-01-19 Sebastian Dröge * gst/rawparse/gstrawparse.c: (gst_raw_parse_loop): diff --git a/gst/rawparse/gstrawparse.c b/gst/rawparse/gstrawparse.c index be7549b0..cbb43a45 100644 --- a/gst/rawparse/gstrawparse.c +++ b/gst/rawparse/gstrawparse.c @@ -221,9 +221,13 @@ gst_raw_parse_push_buffer (GstRawParse * rp, GstBuffer * buffer) gst_util_uint64_scale (rp->n_frames, GST_SECOND * rp->fps_d, rp->fps_n); GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale (nframes * GST_SECOND, rp->fps_d, rp->fps_n); + GST_BUFFER_OFFSET (buffer) = rp->offset / rp->framesize; + GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET (buffer) + nframes; } else { GST_BUFFER_TIMESTAMP (buffer) = rp->segment.start; GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_OFFSET (buffer) = rp->offset / rp->framesize; + GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET (buffer) + nframes; } gst_buffer_set_caps (buffer, GST_PAD_CAPS (rp->srcpad)); if (rp->discont) { @@ -296,7 +300,7 @@ gst_raw_parse_loop (GstElement * element) goto pause; } - if (rp_class->multiple_frames_per_buffer) + if (rp_class->multiple_frames_per_buffer && rp->framesize < 4096) size = 4096 - (4096 % rp->framesize); else size = rp->framesize; @@ -330,10 +334,15 @@ gst_raw_parse_loop (GstElement * element) GST_DEBUG_OBJECT (rp, "Short read at offset %" G_GINT64_FORMAT ", got only %u of %u bytes", rp->offset, GST_BUFFER_SIZE (buffer), size); - gst_buffer_unref (buffer); - buffer = NULL; - ret = GST_FLOW_UNEXPECTED; - goto pause; + + if (size > rp->framesize) { + GST_BUFFER_SIZE (buffer) -= GST_BUFFER_SIZE (buffer) % rp->framesize; + } else { + gst_buffer_unref (buffer); + buffer = NULL; + ret = GST_FLOW_UNEXPECTED; + goto pause; + } } if (rp->need_newsegment) { -- cgit v1.2.1