From 9b012745805d997a3fe4cefa4425a515f8da1759 Mon Sep 17 00:00:00 2001 From: Jussi Saavalainen Date: Mon, 10 Sep 2012 15:34:51 +0300 Subject: [PATCH] Give real instead of page-aligned buffer size to Gstreamer We handle all our buffers as page-aligned mmap'ed chunks, and so their size is often larger than their contents. This breaks plugins that insist on computing the buffer size from the caps we report. Fix this by explicitly setting GST_BUFFER_SIZE for the final buffer as the content size. This will break if we ever want to use this camera source with devices that can do encoding on the v4l layer or below. Change-Id: I1b6d848162bfa9e06e729ebb7b6d986ba5a056ce --- gst/mfldv4l2cam/v4l2camsrc_calls.c | 9 +++++++-- packaging/mfldv4l2camsrc.changes | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gst/mfldv4l2cam/v4l2camsrc_calls.c b/gst/mfldv4l2cam/v4l2camsrc_calls.c index a5c7b16..c01f632 100644 --- a/gst/mfldv4l2cam/v4l2camsrc_calls.c +++ b/gst/mfldv4l2cam/v4l2camsrc_calls.c @@ -252,7 +252,7 @@ gst_v4l2camsrc_buffer_new (GstMFLDV4l2CamSrcBufferPool * pool, } } - GST_BUFFER_SIZE (ret) = vbuffer->length; + GST_BUFFER_SIZE (ret) = v4l2camsrc->frame_byte_size; GST_BUFFER_FLAG_SET (ret, GST_BUFFER_FLAG_READONLY); gst_buffer_set_caps (GST_BUFFER (ret), caps); @@ -1563,6 +1563,7 @@ gst_v4l2camsrc_get_frame_size (guint32 fourcc, guint * w, guint * h) outsize += (GST_ROUND_UP_4 (*w) * *h) / 2; break; } + return outsize; } @@ -2006,6 +2007,7 @@ gst_v4l2camsrc_grab_frame (GstCameraSrc * camsrc, GstBuffer ** buf, gint32 trials = NUM_TRIALS; GstBuffer *pool_buffer; gboolean need_copy = v4l2camsrc->use_copy; + gboolean variable_frame_size = FALSE; /* FIXME if we ever support JPEG etc */ gint index; gint ret; @@ -2161,7 +2163,10 @@ gst_v4l2camsrc_grab_frame (GstCameraSrc * camsrc, GstBuffer ** buf, g_mutex_unlock (v4l2camsrc->pool->lock); /* this can change at every frame, esp. with jpeg */ - GST_BUFFER_SIZE (pool_buffer) = buffer.bytesused; + if(variable_frame_size) + GST_BUFFER_SIZE (pool_buffer) = buffer.bytesused; + else + GST_BUFFER_SIZE (pool_buffer) = v4l2camsrc->frame_byte_size; GST_BUFFER_OFFSET (pool_buffer) = v4l2camsrc->offset++; GST_BUFFER_OFFSET_END (pool_buffer) = v4l2camsrc->offset; diff --git a/packaging/mfldv4l2camsrc.changes b/packaging/mfldv4l2camsrc.changes index a350e5e..ef94c91 100644 --- a/packaging/mfldv4l2camsrc.changes +++ b/packaging/mfldv4l2camsrc.changes @@ -1,3 +1,6 @@ +* Mon Sep 10 2012 Jussi Saavalainen submit/2.0_beta/20120906.125813@efe13b9 +- Give real instead of page-aligned buffer size to Gstreamer + * Thu Sep 06 2012 Marko Ollonen submit/2.0_beta/20120905.114619@8dcf023 - return value in camera_control_set_strobe changed -- 2.7.4