On Thu, Jun 15, 2023 at 02:20:07PM +0530, Prasanth Babu Mantena wrote: > The specified gstreamer patches are needed to default the format for non > multiplanar formats as preference. Added handling of v4l2 buffer flags > in the plugin code. These patches are needed for working of dmabuf > import on the J721S2 and J784S4 which codec does not support dynamic > register of dma buffers. > > Signed-off-by: Prasanth Babu Mantena <[email protected]> > --- > ...l2-Changes-for-DMA-Buf-import-j721s2.patch | 139 ++++++++++++++++++ > ...ence-to-contiguous-format-if-support.patch | 51 +++++++ > .../gstreamer1.0-plugins-good_1.20.%.bbappend | 18 +++ > 3 files changed, 208 insertions(+) > create mode 100644 > meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-v4l2-Changes-for-DMA-Buf-import-j721s2.patch > create mode 100644 > meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0002-v4l2-Give-preference-to-contiguous-format-if-support.patch > create mode 100644 > meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.20.%.bbappend > > diff --git > a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-v4l2-Changes-for-DMA-Buf-import-j721s2.patch > > b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-v4l2-Changes-for-DMA-Buf-import-j721s2.patch > new file mode 100644 > index 00000000..45ad91ee > --- /dev/null > +++ > b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-v4l2-Changes-for-DMA-Buf-import-j721s2.patch > @@ -0,0 +1,139 @@ > +From b46a76bc1010aee88828eddcb4b3da01ce710b27 Mon Sep 17 00:00:00 2001 > +From: Prasanth Babu Mantena <[email protected]> > +Date: Wed, 7 Jun 2023 18:24:55 +0530 > +Subject: [PATCH] v4l2: Changes for DMA Buf import j721s2 > + > +Add checks to release the buffer to downstream pool when returned with > +error flag from the driver. This buffer which registered with driver is > +used a an offset buffer without any new allocation in downstram pool. > + > +Signed-off-by: Prasanth Babu Mantena <[email protected]> > +--- > + sys/v4l2/gstv4l2bufferpool.c | 17 ++++++++++++++--- > + sys/v4l2/gstv4l2bufferpool.h | 2 ++ > + sys/v4l2/gstv4l2object.c | 4 ++-- > + sys/v4l2/gstv4l2videodec.c | 20 ++++++++++++++------ > + 4 files changed, 32 insertions(+), 11 deletions(-) > + > +diff --git a/sys/v4l2/gstv4l2bufferpool.c b/sys/v4l2/gstv4l2bufferpool.c > +index d85f036..e6a60dc 100644 > +--- a/sys/v4l2/gstv4l2bufferpool.c > ++++ b/sys/v4l2/gstv4l2bufferpool.c > +@@ -83,7 +83,7 @@ enum _GstV4l2BufferState > + static void gst_v4l2_buffer_pool_complete_release_buffer (GstBufferPool * > bpool, > + GstBuffer * buffer, gboolean queued); > + > +-static gboolean > ++gboolean > + gst_v4l2_is_buffer_valid (GstBuffer * buffer, GstV4l2MemoryGroup ** > out_group) > + { > + GstMemory *mem = gst_buffer_peek_memory (buffer, 0); > +@@ -1638,11 +1638,22 @@ gst_v4l2_buffer_pool_complete_release_buffer > (GstBufferPool * bpool, > + gst_v4l2_allocator_reset_group (pool->vallocator, group); > + /* queue back in the device */ > + if (pool->other_pool) > +- ret = gst_v4l2_buffer_pool_prepare_buffer (pool, buffer, > NULL); > +- if (ret != GST_FLOW_OK || > ++ { > ++ if(!(group->buffer.flags & V4L2_BUF_FLAG_ERROR)) > ++ ret = gst_v4l2_buffer_pool_prepare_buffer (pool, buffer, > NULL); > ++ } > ++ if(!(group->buffer.flags & V4L2_BUF_FLAG_ERROR)) { > ++ if (ret != GST_FLOW_OK || > + gst_v4l2_buffer_pool_qbuf (pool, buffer, group, > + NULL) != GST_FLOW_OK) > + pclass->release_buffer (bpool, buffer); > ++ } > ++ else > ++ { > ++ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_TAG_MEMORY); > ++ pclass->release_buffer (bpool, buffer); > ++ > ++ } > + } else { > + /* Simply release invalid/modified buffer, the allocator will > + * give it back later */ > +diff --git a/sys/v4l2/gstv4l2bufferpool.h b/sys/v4l2/gstv4l2bufferpool.h > +index 60340c2..cec4207 100644 > +--- a/sys/v4l2/gstv4l2bufferpool.h > ++++ b/sys/v4l2/gstv4l2bufferpool.h > +@@ -124,6 +124,8 @@ gboolean gst_v4l2_buffer_pool_orphan > (GstV4l2Object * v4l2object); > + > + void gst_v4l2_buffer_pool_enable_resolution_change > (GstV4l2BufferPool *self); > + > ++gboolean gst_v4l2_is_buffer_valid (GstBuffer * buffer, > GstV4l2MemoryGroup ** out_group); > ++ > + G_END_DECLS > + > + #endif /*__GST_V4L2_BUFFER_POOL_H__ */ > +diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c > +index ee60540..e9026da 100644 > +--- a/sys/v4l2/gstv4l2object.c > ++++ b/sys/v4l2/gstv4l2object.c > +@@ -5040,7 +5040,7 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * > obj, GstQuery * query) > + } else { > + /* In this case we'll have to configure two buffer pool. For our buffer > + * pool, we'll need what the driver one, and one more, so we can dequeu > */ > +- own_min = obj->min_buffers + 1; > ++ own_min = obj->min_buffers + 2; > + own_min = MAX (own_min, GST_V4L2_MIN_BUFFERS (obj)); > + > + /* for the downstream pool, we keep what downstream wants, though ensure > +@@ -5050,7 +5050,7 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * > obj, GstQuery * query) > + > + /* To import we need the other pool to hold at least own_min */ > + if (obj_pool == pool) > +- min += own_min; > ++ min = own_min; > + } > + > + /* Request a bigger max, if one was suggested but it's too small */ > +diff --git a/sys/v4l2/gstv4l2videodec.c b/sys/v4l2/gstv4l2videodec.c > +index 3042995..0e4ac09 100644 > +--- a/sys/v4l2/gstv4l2videodec.c > ++++ b/sys/v4l2/gstv4l2videodec.c > +@@ -536,6 +536,8 @@ gst_v4l2_video_dec_loop (GstVideoDecoder * decoder) > + GstVideoCodecFrame *frame; > + GstBuffer *buffer = NULL; > + GstFlowReturn ret; > ++ GstV4l2MemoryGroup *group; > ++ int buffer_valid=0; > + > + GST_LOG_OBJECT (decoder, "Allocate output buffer"); > + > +@@ -558,6 +560,7 @@ gst_v4l2_video_dec_loop (GstVideoDecoder * decoder) > + > + if (ret != GST_FLOW_OK) > + goto beach; > ++ buffer_valid = gst_v4l2_is_buffer_valid (buffer, &group); > + > + GST_LOG_OBJECT (decoder, "Process output buffer"); > + { > +@@ -602,13 +605,18 @@ gst_v4l2_video_dec_loop (GstVideoDecoder * decoder) > + if (oldest_frame) > + gst_video_codec_frame_unref (oldest_frame); > + > +- frame->duration = self->v4l2capture->duration; > +- frame->output_buffer = buffer; > +- buffer = NULL; > +- ret = gst_video_decoder_finish_frame (decoder, frame); > ++ if(!(buffer_valid && (group->buffer.flags & V4L2_BUF_FLAG_ERROR))) { > ++ frame->duration = self->v4l2capture->duration; > ++ frame->output_buffer = buffer; > ++ buffer = NULL; > ++ ret = gst_video_decoder_finish_frame (decoder, frame); > ++ if (ret != GST_FLOW_OK) > ++ goto beach; > ++ } > ++ else { > ++ gst_buffer_unref (buffer); > ++ } > + > +- if (ret != GST_FLOW_OK) > +- goto beach; > + } else { > + GST_WARNING_OBJECT (decoder, "Decoder is producing too many buffers"); > + gst_buffer_unref (buffer); > +-- > +2.39.0 > + > diff --git > a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0002-v4l2-Give-preference-to-contiguous-format-if-support.patch > > b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0002-v4l2-Give-preference-to-contiguous-format-if-support.patch > new file mode 100644 > index 00000000..d41a61c7 > --- /dev/null > +++ > b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0002-v4l2-Give-preference-to-contiguous-format-if-support.patch > @@ -0,0 +1,51 @@ > +From 0238a430b19e5302dc924321225a3e24778bd2b0 Mon Sep 17 00:00:00 2001 > +From: Devarsh Thakkar <[email protected]> > +Date: Fri, 9 Mar 2018 10:30:47 -0800 > +Subject: [PATCH] v4l2: Give preference to contiguous format if supported > + > +Currently gstreamer uses single format GST_VIDEO_FORMAT_NV12 for both > +NV12 (which uses single contiguous buffer for luma and chroma) > +and NV12M (uses two non-contiguous buffers for luma and chroma ) > +and if device supports both NV12M and NV12 then it gives preference > +to NV12M over NV12. > + > +The logic to give preference to NV12 before NV12M whenever > GST_VIDEO_FORMAT_NV12 > +is set. > + > +Signed-off-by: Devarsh Thakkar <[email protected]> > +Signed-off-by: Prasanth Babu Mantena <[email protected]> > +--- > + sys/v4l2/gstv4l2object.c | 12 ++++++------ > + 1 file changed, 6 insertions(+), 6 deletions(-) > + > +diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c > +index e9026da..ad9f630 100644 > +--- a/sys/v4l2/gstv4l2object.c > ++++ b/sys/v4l2/gstv4l2object.c > +@@ -1930,17 +1930,17 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * > v4l2object, GstCaps * caps, > + } > + > + > +- /* Prefer the non-contiguous if supported */ > +- v4l2object->prefered_non_contiguous = TRUE; > ++ /* Prefer the contiguous if supported */ > ++ v4l2object->prefered_non_contiguous = FALSE; > + > +- if (fourcc_nc) > +- fmt = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc_nc); > ++ if (fourcc) > ++ fmt = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc); > + else if (fourcc == 0) > + goto unhandled_format; > + > + if (fmt == NULL) { > +- fmt = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc); > +- v4l2object->prefered_non_contiguous = FALSE; > ++ fmt = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc_nc); > ++ v4l2object->prefered_non_contiguous = TRUE; > + } > + > + if (fmt == NULL) > +-- > +2.39.0 > + > diff --git > a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.20.%.bbappend > > b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.20.%.bbappend > new file mode 100644 > index 00000000..1c4c8515 > --- /dev/null > +++ > b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.20.%.bbappend > @@ -0,0 +1,18 @@ > +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" > + > +SRC_URI:append:j721s2 = " \ > + file://0001-v4l2-Changes-for-DMA-Buf-import-j721s2.patch \ > + file://0002-v4l2-Give-preference-to-contiguous-format-if-support.patch \ > +" > + > +SRC_URI:append:j784s4 = " \ > + file://0001-v4l2-Changes-for-DMA-Buf-import-j721s2.patch \ > + file://0002-v4l2-Give-preference-to-contiguous-format-if-support.patch \ > +" > + > +SRC_URI:append:am62axx = " \ > + file://0001-v4l2-Changes-for-DMA-Buf-import-j721s2.patch \ > + file://0002-v4l2-Give-preference-to-contiguous-format-if-support.patch \ > +" > + > +PR:append = ".arago0"
^^^ 1. this is not arago 2. this will break yocto compliance -=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#14639): https://lists.yoctoproject.org/g/meta-arago/message/14639 Mute This Topic: https://lists.yoctoproject.org/mt/99544790/21656 Group Owner: [email protected] Unsubscribe: https://lists.yoctoproject.org/g/meta-arago/leave/10763299/21656/89520264/xyzzy [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
