This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

SK-TDA4VM: Caught SIGSEGV

Part Number: SK-TDA4VM


Tool/software:

I am learning to develop custom gstreamer plugins that uses the VPAC and VISS modules of the SK-TDA4VM for processing , to start with I have wriiten a plugin vissconvert that converts the bayer frames captured into NV12 format. I get the below error when I run the pipeline,


root@tda4vm-sk:/usr/custom_plugins# make clean
rm -f libgstvissconvert.so
root@tda4vm-sk:/usr/custom_plugins# make
gcc -Wall -g -O0 -fPIC -pthread -DSOC_J721E -DPACKAGE=\"gst-vissconvert\" -pthread -I/usr/include/gstreamer-1.0 -I/usr/include/orc-0.4 -I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/processor_sdk/tiovx/include -I/usr/include/processor_sdk/tiovx/kernels/include -I/usr/include/edgeai-tiovx-modules -I/usr/include/processor_sdk/vision_apps/kernels/img_proc/include -I/usr/include/processor_sdk/tidl_j7/arm-tidl/rt/inc -I/usr/include/processor_sdk/ivision/ -I/usr/include/edgeai-tiovx-kernels -I/usr/include/processor_sdk/tidl_j7/arm-tidl/tiovx_kernels/include/ -I/usr/include/processor_sdk/vision_apps/kernels/fileio/include -I/usr/include/processor_sdk/imaging -I/usr/include/processor_sdk/imaging/kernels/include -I/opt/edgeai-gst-plugins -I/usr/include/processor_sdk/vision_apps/utils/app_init/include/ -I/usr/include/processor_sdk/vision_apps/utils/app_init/include/ -I/opt/edgeai-gst-plugins/gst-libs/ -I/usr/include/processor_sdk/imaging/utils/iss/include/ gstvissconvert.c -o libgstvissconvert.so -shared -lgstvideo-1.0 -lgstbase-1.0 -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -L/usr/lib -ltivision_apps -ledgeai-tiovx-kernels -ledgeai-apps-utils -lti_rpmsg_char -ledgeai-tiovx-modules -ledgeai-tiovx-apps -lgsttiovx-1.0 -lyaml-cpp -lavformat -lavcodec -lavutil -ledgeai-apps-utils
root@tda4vm-sk:/usr/custom_plugins# make install
cp libgstvissconvert.so /usr/lib/gstreamer-1.0/
rm -f ~/.cache/gstreamer-1.0/registry*.bin
root@tda4vm-sk:/usr/custom_plugins# gst-inspect-1.0 vissconvert
Factory Details:
Rank none (0)
Long-name VISS Convert
Klass Filter/Converter/Video
Description Converts Bayer to NV12 using TIOVX VISS module
Author Your Name <your.email@example.com>

Plugin Details:
Name vissconvert
Description VISS Convert Plugin with Buffer Pooling and DCC Support
Filename /usr/lib/gstreamer-1.0/libgstvissconvert.so
Version 1.0
License LGPL
Source module gst-vissconvert
Binary package GStreamer
Origin URL http://gstreamer.net/

GObject
+----GInitiallyUnowned
+----GstObject
+----GstElement
+----GstVissConvert

Pad Templates:
SINK template: 'sink'
Availability: Always
Capabilities:
video/x-bayer
format: { (string)rggb, (string)bggr, (string)grbg, (string)gbrg }
width: [ 1, 8192 ]
height: [ 1, 8192 ]
framerate: [ 0/1, 2147483647/1 ]

SRC template: 'src'
Availability: Always
Capabilities:
video/x-raw
format: NV12
width: [ 1, 8192 ]
height: [ 1, 8192 ]
framerate: [ 0/1, 2147483647/1 ]

Element has no clocking capabilities.
Element has no URI handling capabilities.

Pads:
SINK: 'sink'
Pad Template: 'sink'
SRC: 'src'
Pad Template: 'src'

Element Properties:
bypass-cac : Bypass Chromatic Aberration Correction
flags: readable, writable
Boolean. Default: true
bypass-dwb : Bypass Dynamic White Balance
flags: readable, writable
Boolean. Default: true
bypass-nsf4 : Bypass Noise Filter 4
flags: readable, writable
Boolean. Default: false
dcc-isp-config-file : Path to DCC ISP configuration file
flags: readable, writable
String. Default: null
format-msb : Most significant bit position for raw format (0-15)
flags: readable, writable
Integer. Range: 0 - 15 Default: 7
name : The name of the object
flags: readable, writable, 0x2000
String. Default: "vissconvert0"
parent : The parent of the object
flags: readable, writable, 0x2000
Object of type "GstObject"
sensor-dcc-id : DCC ID for the sensor (e.g., 219 for IMX219)
flags: readable, writable
Integer. Range: 0 - 2147483647 Default: 219
sensor-name : Name of the sensor (e.g., SENSOR_SONY_IMX219_RPI)
flags: readable, writable
String. Default: "SENSOR_SONY_IMX219_RPI"
(END)
Availability: Always
Capabilities:
video/x-raw
format: NV12
width: [ 1, 8192 ]
height: [ 1, 8192 ]
framerate: [ 0/1, 2147483647/1 ]

Element has no clocking capabilities.
Element has no URI handling capabilities.

Pads:
SINK: 'sink'
Pad Template: 'sink'
SRC: 'src'
Pad Template: 'src'

Element Properties:
bypass-cac : Bypass Chromatic Aberration Correction
flags: readable, writable
Boolean. Default: true
bypass-dwb : Bypass Dynamic White Balance
flags: readable, writable
Boolean. Default: true
bypass-nsf4 : Bypass Noise Filter 4
flags: readable, writable
Boolean. Default: false
dcc-isp-config-file : Path to DCC ISP configuration file
flags: readable, writable
String. Default: null
format-msb : Most significant bit position for raw format (0-15)
flags: readable, writable
Integer. Range: 0 - 15 Default: 7
name : The name of the object
flags: readable, writable, 0x2000
String. Default: "vissconvert0"
parent : The parent of the object
flags: readable, writable, 0x2000
Object of type "GstObject"
sensor-dcc-id : DCC ID for the sensor (e.g., 219 for IMX219)
flags: readable, writable
Integer. Range: 0 - 2147483647 Default: 219
sensor-name : Name of the sensor (e.g., SENSOR_SONY_IMX219_RPI)
flags: readable, writable
String. Default: "SENSOR_SONY_IMX219_RPI"
(END)

root@tda4vm-sk:/usr/custom_plugins# GST_DEBUG=3 gst-launch-1.0 v4l2src device=/dev/video-imx219-cam0 io-mode=dmabuf-import ! video/x-bayer,width=1920,height=1080,framerate=30/1,format=bggr ! vissconvert sensor-name=IMX219 sensor-dcc-id=219 dcc-isp-config-file=/usr/custom_plugins/dcc_viss_1920x1080.bin ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! autovideosink
Setting pipeline to PAUSED ...
0:00:00.665867393 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.666507872 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.666818276 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.667130565 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.667399948 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.667629268 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.667916271 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.668190884 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.669168438 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.669510079 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.669766336 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.670020697 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.670232837 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.670432311 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.670685118 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.676678721 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.676731983 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.676752844 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.676940858 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.676967894 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.676986405 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677003816 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677020677 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677037777 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677055158 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677072329 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677089505 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677106700 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677124476 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677142112 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677159193 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677177374 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677195360 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677212715 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677230321 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677248687 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677266353 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677283924 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677302354 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677320675 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677338096 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677355702 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677372618 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677393184 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677411519 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677429525 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677447386 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.677466162 2170 0x370c2a0 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl0> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726059194 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726112561 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726131932 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726148763 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726164633 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726180639 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726195465 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726211861 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726226501 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726241622 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726256578 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726272938 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726287789 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726304080 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726319411 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726336146 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726350857 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726365873 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726380713 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726395989 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726410755 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726426265 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726441271 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726456382 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726471512 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726487013 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726502559 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726518615 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726533670 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726549741 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726565207 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726580997 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726595563 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726611379 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726628820 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726646315 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726661706 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726677302 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726692218 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726708263 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726722959 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726738070 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726752935 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726768641 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726784487 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726801873 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726817818 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
0:00:00.726833249 2170 0x3733640 WARN glcontext gstglcontext_egl.c:552:gst_gl_context_egl_dump_config:<glcontextegl1> unknown EGL_COLOR_BUFFER_TYPE value 3300
Caught SIGSEGV
#0 0x0000ffff93fc9218 in wait4 () from /lib/libc.so.6
#1 0x0000ffff94164358 in g_on_error_stack_trace ()
#2 0x00000000004053a4 in ?? ()
#3 <signal handler called>
#4 0x0000ffff93a940f8 in gst_viss_convert_init_module (self=0x376d530)
#5 0x0000ffff93a96ba4 in gst_viss_convert_change_state (element=0x376d530,
#6 0x0000ffff942ff170 in gst_element_change_state ()
#7 0x0000ffff942ff90c in ?? () from /usr/lib/libgstreamer-1.0.so.0
#8 0x0000ffff942d8d24 in ?? () from /usr/lib/libgstreamer-1.0.so.0
#9 0x0000ffff9432d3e0 in ?? () from /usr/lib/libgstreamer-1.0.so.0
#10 0x0000ffff942ff170 in gst_element_change_state ()
#11 0x0000ffff942ff90c in ?? () from /usr/lib/libgstreamer-1.0.so.0
#12 0x0000000000404188 in ?? ()
#13 0x0000ffff93f3b230 in ?? () from /lib/libc.so.6
#14 0x0000ffff93f3b30c in __libc_start_main () from /lib/libc.so.6
#15 0x00000000004045f0 in _start ()
Spinning. Please run 'gdb gst-launch-1.0 2170' to continue debugging, Ctrl-C to quit, or Ctrl-\ to dump core.
^C
root@tda4vm-sk:/usr/custom_plugins#



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gst/gst.h>
#include <gst/tiovx/gsttiovxallocator.h>
#include <gst/tiovx/gsttiovx.h>
#include <gst/video/video.h>
#include <TI/tivx.h>
#include <TI/tivx_mem.h>
#include <TI/tivx_ext_raw_image.h>
#include <tiovx_viss_module.h>
#include <tiovx_sensor_module.h>
#include <app_iss.h>
#include "gstvissconvert.h"

GST_DEBUG_CATEGORY_STATIC(gst_viss_convert_debug_category); /* Declare debug category */
#define GST_CAT_DEFAULT gst_viss_convert_debug_category
G_DEFINE_TYPE_WITH_PRIVATE(GstVissConvert, gst_viss_convert, GST_TYPE_ELEMENT);

enum {
    PROP_0,
    PROP_SENSOR_NAME,
    PROP_DCC_ISP_CONFIG_FILE,
    PROP_SENSOR_DCC_ID,
    PROP_BYPASS_CAC,
    PROP_BYPASS_DWB,
    PROP_BYPASS_NSF4,
    PROP_FORMAT_MSB,
};

static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE(
    "sink",
    GST_PAD_SINK,
    GST_PAD_ALWAYS,
    GST_STATIC_CAPS("video/x-bayer, "
                    "format=(string){rggb,bggr,grbg,gbrg}, "
                    "width=[1,8192], height=[1,8192], "
                    "framerate=(fraction)[0/1, MAX]")
);

static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE(
    "src",
    GST_PAD_SRC,
    GST_PAD_ALWAYS,
    GST_STATIC_CAPS("video/x-raw, "
                    "format=(string)NV12, "
                    "width=[1,8192], height=[1,8192], "
                    "framerate=(fraction)[0/1, MAX]")
);

static void gst_viss_convert_init(GstVissConvert *self);
static void gst_viss_convert_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
static void gst_viss_convert_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
static void gst_viss_convert_finalize(GObject *object);
static GstStateChangeReturn gst_viss_convert_change_state(GstElement *element, GstStateChange transition);
static GstFlowReturn gst_viss_convert_chain(GstPad *pad, GstObject *parent, GstBuffer *buffer);
static gboolean gst_viss_convert_event(GstPad *pad, GstObject *parent, GstEvent *event);
static gboolean gst_viss_convert_init_module(GstVissConvert *self);
static gboolean gst_viss_convert_create_graph(GstVissConvert *self);
static gboolean gst_viss_convert_deinit_module(GstVissConvert *self);
static GstBufferPool *gst_viss_convert_create_buffer_pool(GstVissConvert *self, GstVideoInfo *info, gboolean is_output);

static void
gst_viss_convert_class_init(GstVissConvertClass *klass)
{
    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
    GstElementClass *gstelement_class = GST_ELEMENT_CLASS(klass);

    gobject_class->set_property = gst_viss_convert_set_property;
    gobject_class->get_property = gst_viss_convert_get_property;
    gobject_class->finalize = gst_viss_convert_finalize;
    gstelement_class->change_state = gst_viss_convert_change_state;

    g_object_class_install_property(gobject_class, PROP_SENSOR_NAME,
        g_param_spec_string("sensor-name", "Sensor Name",
                            "Name of the sensor (e.g., SENSOR_SONY_IMX219_RPI)", "SENSOR_SONY_IMX219_RPI",
                            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
    g_object_class_install_property(gobject_class, PROP_DCC_ISP_CONFIG_FILE,
        g_param_spec_string("dcc-isp-config-file", "DCC ISP Config File",
                            "Path to DCC ISP configuration file", NULL,
                            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
    g_object_class_install_property(gobject_class, PROP_SENSOR_DCC_ID,
        g_param_spec_int("sensor-dcc-id", "Sensor DCC ID",
                         "DCC ID for the sensor (e.g., 219 for IMX219)", 0, G_MAXINT, 219,
                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
    g_object_class_install_property(gobject_class, PROP_BYPASS_CAC,
        g_param_spec_boolean("bypass-cac", "Bypass CAC",
                             "Bypass Chromatic Aberration Correction", TRUE,
                             G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
    g_object_class_install_property(gobject_class, PROP_BYPASS_DWB,
        g_param_spec_boolean("bypass-dwb", "Bypass DWB",
                             "Bypass Dynamic White Balance", TRUE,
                             G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
    g_object_class_install_property(gobject_class, PROP_BYPASS_NSF4,
        g_param_spec_boolean("bypass-nsf4", "Bypass NSF4",
                             "Bypass Noise Filter 4", FALSE,
                             G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
    g_object_class_install_property(gobject_class, PROP_FORMAT_MSB,
        g_param_spec_int("format-msb", "Format MSB",
                         "Most significant bit position for raw format (0-15)", 0, 15, 7,
                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));

    gst_element_class_add_static_pad_template(gstelement_class, &sink_template);
    gst_element_class_add_static_pad_template(gstelement_class, &src_template);

    gst_element_class_set_static_metadata(gstelement_class,
                                         "VISS Convert",
                                         "Filter/Converter/Video",
                                         "Converts Bayer to NV12 using TIOVX VISS module",
                                         "Your Name <your.email@example.com>");
}

static void
gst_viss_convert_init(GstVissConvert *self)
{
    GstVissConvertPrivate *priv = gst_viss_convert_get_instance_private(self);
    priv->context = NULL;
    priv->graph = NULL;
    priv->sensor_name = g_strdup("SENSOR_SONY_IMX219_RPI");
    priv->dcc_isp_config_file = NULL;
    priv->sensor_dcc_id = 219;
    priv->bypass_cac = TRUE;
    priv->bypass_dwb = TRUE;
    priv->bypass_nsf4 = FALSE;
    priv->format_msb = 7;
    priv->initialized = FALSE;
    priv->input_pool = NULL;
    priv->output_pool = NULL;
    self->sinkpad = gst_pad_new_from_static_template(&sink_template, "sink");
    self->srcpad = gst_pad_new_from_static_template(&src_template, "src");
    gst_pad_set_chain_function(self->sinkpad, GST_DEBUG_FUNCPTR(gst_viss_convert_chain));
    gst_pad_set_event_function(self->sinkpad, GST_DEBUG_FUNCPTR(gst_viss_convert_event));
    gst_element_add_pad(GST_ELEMENT(self), self->sinkpad);
    gst_element_add_pad(GST_ELEMENT(self), self->srcpad);
}

static void
gst_viss_convert_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
    GstVissConvert *self = GST_VISS_CONVERT(object);
    GstVissConvertPrivate *priv = gst_viss_convert_get_instance_private(self);

    switch (prop_id) {
        case PROP_SENSOR_NAME:
            g_free(priv->sensor_name);
            priv->sensor_name = g_value_dup_string(value);
            GST_DEBUG_OBJECT(self, "Set sensor-name: %s", priv->sensor_name ? priv->sensor_name : "(null)");
            break;
        case PROP_DCC_ISP_CONFIG_FILE:
            g_free(priv->dcc_isp_config_file);
            priv->dcc_isp_config_file = g_value_dup_string(value);
            GST_DEBUG_OBJECT(self, "Set dcc-isp-config-file: %s", priv->dcc_isp_config_file ? priv->dcc_isp_config_file : "(null)");
            break;
        case PROP_SENSOR_DCC_ID:
            priv->sensor_dcc_id = g_value_get_int(value);
            GST_DEBUG_OBJECT(self, "Set sensor-dcc-id: %d", priv->sensor_dcc_id);
            break;
        case PROP_BYPASS_CAC:
            priv->bypass_cac = g_value_get_boolean(value);
            GST_DEBUG_OBJECT(self, "Set bypass-cac: %d", priv->bypass_cac);
            break;
        case PROP_BYPASS_DWB:
            priv->bypass_dwb = g_value_get_boolean(value);
            GST_DEBUG_OBJECT(self, "Set bypass-dwb: %d", priv->bypass_dwb);
            break;
        case PROP_BYPASS_NSF4:
            priv->bypass_nsf4 = g_value_get_boolean(value);
            GST_DEBUG_OBJECT(self, "Set bypass-nsf4: %d", priv->bypass_nsf4);
            break;
        case PROP_FORMAT_MSB:
            priv->format_msb = g_value_get_int(value);
            GST_DEBUG_OBJECT(self, "Set format-msb: %d", priv->format_msb);
            break;
        default:
            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
            break;
    }
}

static void
gst_viss_convert_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
    GstVissConvert *self = GST_VISS_CONVERT(object);
    GstVissConvertPrivate *priv = gst_viss_convert_get_instance_private(self);

    switch (prop_id) {
        case PROP_SENSOR_NAME:
            g_value_set_string(value, priv->sensor_name);
            break;
        case PROP_DCC_ISP_CONFIG_FILE:
            g_value_set_string(value, priv->dcc_isp_config_file);
            break;
        case PROP_SENSOR_DCC_ID:
            g_value_set_int(value, priv->sensor_dcc_id);
            break;
        case PROP_BYPASS_CAC:
            g_value_set_boolean(value, priv->bypass_cac);
            break;
        case PROP_BYPASS_DWB:
            g_value_set_boolean(value, priv->bypass_dwb);
            break;
        case PROP_BYPASS_NSF4:
            g_value_set_boolean(value, priv->bypass_nsf4);
            break;
        case PROP_FORMAT_MSB:
            g_value_set_int(value, priv->format_msb);
            break;
        default:
            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
            break;
    }
}

static void
gst_viss_convert_finalize(GObject *object)
{
    GstVissConvert *self = GST_VISS_CONVERT(object);
    GstVissConvertPrivate *priv = gst_viss_convert_get_instance_private(self);

    GST_LOG_OBJECT(self, "Finalizing VISS Convert");

    if (priv->input_pool) {
        GST_DEBUG_OBJECT(self, "Deactivating and unreferencing input_pool");
        gst_buffer_pool_set_active(priv->input_pool, FALSE);
        gst_object_unref(priv->input_pool);
        priv->input_pool = NULL;
    }
    if (priv->output_pool) {
        GST_DEBUG_OBJECT(self, "Deactivating and unreferencing output_pool");
        gst_buffer_pool_set_active(priv->output_pool, FALSE);
        gst_object_unref(priv->output_pool);
        priv->output_pool = NULL;
    }

    if (priv->initialized) {
        GST_DEBUG_OBJECT(self, "Deinitializing TIOVX module during finalize");
        if (!gst_viss_convert_deinit_module(self)) {
            GST_ERROR_OBJECT(self, "Failed to deinitialize TIOVX module during finalize");
        }
    }

    g_free(priv->sensor_name);
    g_free(priv->dcc_isp_config_file);
    priv->sensor_name = NULL;
    priv->dcc_isp_config_file = NULL;

    G_OBJECT_CLASS(gst_viss_convert_parent_class)->finalize(object);
}

static GstBufferPool *
gst_viss_convert_create_buffer_pool(GstVissConvert *self, GstVideoInfo *info, gboolean is_output)
{
    GstBufferPool *pool = NULL;
    GstStructure *config;
    GstAllocator *allocator = NULL;
    GstAllocationParams params = {0, 4095, 0, 0};
    gsize size;

    GST_DEBUG_OBJECT(self, "Creating %s buffer pool", is_output ? "output" : "input");

    allocator = gst_allocator_find("TIOVXAllocator");
    if (!allocator) {
        GST_ERROR_OBJECT(self, "TIOVXAllocator not found");
        return NULL;
    }

    pool = gst_buffer_pool_new();
    if (!pool) {
        GST_ERROR_OBJECT(self, "Failed to create buffer pool");
        gst_object_unref(allocator);
        return NULL;
    }

    config = gst_buffer_pool_get_config(pool);
    size = GST_VIDEO_INFO_SIZE(info);
    gst_buffer_pool_config_set_params(config, NULL, size, 2, 0);
    gst_buffer_pool_config_set_allocator(config, allocator, &params);
    gst_buffer_pool_config_add_option(config, GST_BUFFER_POOL_OPTION_VIDEO_META);

    if (!gst_buffer_pool_set_config(pool, config)) {
        GST_ERROR_OBJECT(self, "Failed to set buffer pool config");
        gst_object_unref(pool);
        gst_object_unref(allocator);
        return NULL;
    }

    if (!gst_buffer_pool_set_active(pool, TRUE)) {
        GST_ERROR_OBJECT(self, "Failed to activate %s buffer pool", is_output ? "output" : "input");
        gst_object_unref(pool);
        gst_object_unref(allocator);
        return NULL;
    }

    gst_object_unref(allocator);
    GST_DEBUG_OBJECT(self, "Created %s buffer pool with size %ld bytes", is_output ? "output" : "input", size);
    return pool;
}

static gboolean
gst_viss_convert_init_module(GstVissConvert *self)
{
    GstVissConvertPrivate *priv = gst_viss_convert_get_instance_private(self);
    vx_status status;

    GST_DEBUG_OBJECT(self, "Initializing TIOVX VISS module");

    if (!priv->sensor_name || strlen(priv->sensor_name) == 0) {
        GST_ERROR_OBJECT(self, "Sensor name not specified");
        return FALSE;
    }

    /* Validate input video info */
    if (GST_VIDEO_INFO_FORMAT(&priv->in_info) == GST_VIDEO_FORMAT_UNKNOWN ||
        GST_VIDEO_INFO_WIDTH(&priv->in_info) <= 0 ||
        GST_VIDEO_INFO_HEIGHT(&priv->in_info) <= 0) {
        GST_ERROR_OBJECT(self, "Invalid input video info: format=%d, width=%d, height=%d",
                         GST_VIDEO_INFO_FORMAT(&priv->in_info),
                         GST_VIDEO_INFO_WIDTH(&priv->in_info),
                         GST_VIDEO_INFO_HEIGHT(&priv->in_info));
        return FALSE;
    }

    /* Align width and height to 16 to match tiovxisp */
    if (GST_VIDEO_INFO_WIDTH(&priv->in_info) % 16 != 0 || GST_VIDEO_INFO_HEIGHT(&priv->in_info) % 16 != 0) {
        GST_WARNING_OBJECT(self, "Width (%d) or height (%d) not aligned to 16, adjusting",
                           GST_VIDEO_INFO_WIDTH(&priv->in_info), GST_VIDEO_INFO_HEIGHT(&priv->in_info));
        gint aligned_width = ((GST_VIDEO_INFO_WIDTH(&priv->in_info) + 15) / 16) * 16;
        gint aligned_height = ((GST_VIDEO_INFO_HEIGHT(&priv->in_info) + 15) / 16) * 16;
        GST_DEBUG_OBJECT(self, "Adjusted to width=%d, height=%d", aligned_width, aligned_height);
        gst_video_info_set_format(&priv->in_info, GST_VIDEO_INFO_FORMAT(&priv->in_info), aligned_width, aligned_height);
        gst_video_info_set_format(&priv->out_info, GST_VIDEO_FORMAT_NV12, aligned_width, aligned_height);
    }

    if (appCommonInit() != 0) {
        GST_ERROR_OBJECT(self, "Failed to initialize ISS common framework");
        return FALSE;
    }

    tivxInit();
    tivxHostInit();

    FILE *meminfo = fopen("/proc/meminfo", "r");
    unsigned long cma_total = 0, cma_free = 0;
    if (meminfo) {
        char line[256];
        while (fgets(line, sizeof(line), meminfo)) {
            if (sscanf(line, "CmaTotal: %lu kB", &cma_total) == 1) {
                GST_LOG_OBJECT(self, "CMA Total: %lu kB", (unsigned long)cma_total);
            }
            if (sscanf(line, "CmaFree: %lu kB", &cma_free) == 1) {
                GST_LOG_OBJECT(self, "CMA Free: %lu kB", (unsigned long)cma_free);
                if (cma_free < 20000) {
                    GST_ERROR_OBJECT(self, "Insufficient CMA memory: %lu kB, need at least 20MB", (unsigned long)cma_free);
                    fclose(meminfo);
                    appCommonDeInit();
                    return FALSE;
                }
                break;
            }
        }
        fclose(meminfo);
    } else {
        GST_WARNING_OBJECT(self, "Failed to read /proc/meminfo for CMA check");
    }

    priv->context = vxCreateContext();
    if (vxGetStatus((vx_reference)priv->context) != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Failed to create VX context");
        appCommonDeInit();
        return FALSE;
    }

    memset(&priv->sensor_obj, 0, sizeof(SensorObj));
    g_strlcpy(priv->sensor_obj.sensor_name, priv->sensor_name, ISS_SENSORS_MAX_NAME);
    priv->sensor_obj.image_width = GST_VIDEO_INFO_WIDTH(&priv->in_info);
    priv->sensor_obj.image_height = GST_VIDEO_INFO_HEIGHT(&priv->in_info);
    priv->sensor_obj.num_cameras_enabled = 1;
    priv->sensor_obj.sensor_out_format = 0; /* 0 for RAW (Bayer) */
    priv->sensor_obj.usecase_option = TIOVX_SENSOR_MODULE_FEATURE_CFG_UC0;
    priv->sensor_obj.ch_mask = 1;
    priv->sensor_obj.enable_ldc = 0;
    priv->sensor_obj.sensor_dcc_enabled = FALSE;

    /* Handle DCC configuration */
    if (priv->dcc_isp_config_file && strlen(priv->dcc_isp_config_file) > 0) {
        FILE *dcc_file = fopen(priv->dcc_isp_config_file, "rb");
        if (!dcc_file) {
            GST_WARNING_OBJECT(self, "Cannot open DCC ISP file: %s (%s)", priv->dcc_isp_config_file, g_strerror(errno));
        } else {
            GST_DEBUG_OBJECT(self, "DCC ISP file found: %s", priv->dcc_isp_config_file);
            priv->sensor_obj.sensor_dcc_enabled = TRUE;
            g_strlcpy(priv->viss_obj.dcc_config_file_path, priv->dcc_isp_config_file, 256);
            fclose(dcc_file);
        }
    } else {
        GST_DEBUG_OBJECT(self, "No DCC ISP file specified, proceeding without DCC");
        priv->viss_obj.dcc_config_file_path[0] = '\0';
    }

    priv->sensor_obj.sensorParams.dccId = priv->sensor_dcc_id;
    GST_DEBUG_OBJECT(self, "Sensor DCC enabled: %d, dccId=%d",
                     priv->sensor_obj.sensor_dcc_enabled, priv->sensor_obj.sensorParams.dccId);

    status = tiovx_querry_sensor(&priv->sensor_obj);
    if (status != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Failed to query sensor %s: %d", priv->sensor_name, status);
        vxReleaseContext(&priv->context);
        appCommonDeInit();
        return FALSE;
    }

    status = tiovx_init_sensor(&priv->sensor_obj, priv->sensor_name);
    if (status != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Failed to initialize sensor %s: %d", priv->sensor_name, status);
        vxReleaseContext(&priv->context);
        appCommonDeInit();
        return FALSE;
    }

    memset(&priv->viss_obj, 0, sizeof(TIOVXVISSModuleObj));
    priv->viss_obj.input.params.width = GST_VIDEO_INFO_WIDTH(&priv->in_info);
    priv->viss_obj.input.params.height = GST_VIDEO_INFO_HEIGHT(&priv->in_info);
    priv->viss_obj.input.params.format[0].msb = priv->format_msb;
    priv->viss_obj.input.params.format[0].pixel_container = TIVX_RAW_IMAGE_8_BIT;
    priv->viss_obj.input.params.num_exposures = 1; /* Match tiovxisp default */
    priv->viss_obj.input.bufq_depth = 1;
    priv->viss_obj.output2.width = GST_VIDEO_INFO_WIDTH(&priv->out_info);
    priv->viss_obj.output2.height = GST_VIDEO_INFO_HEIGHT(&priv->out_info);
    priv->viss_obj.output2.color_format = VX_DF_IMAGE_NV12;
    priv->viss_obj.output2.bufq_depth = 1;
    priv->viss_obj.params.sensor_dcc_id = priv->sensor_dcc_id;
    priv->viss_obj.params.bypass_cac = priv->bypass_cac ? 1 : 0;
    priv->viss_obj.params.bypass_dwb = priv->bypass_dwb ? 1 : 0;
    priv->viss_obj.params.bypass_nsf4 = priv->bypass_nsf4 ? 1 : 0;
    priv->viss_obj.output_select[2] = TIOVX_VISS_MODULE_OUTPUT_EN;
    for (int i = 0; i < 5; i++) {
        if (i != 2) priv->viss_obj.output_select[i] = TIOVX_VISS_MODULE_OUTPUT_NA;
    }

    GST_DEBUG_OBJECT(self, "VISS input params: width=%d, height=%d, num_exposures=%d, format_msb=%d, pixel_container=%d",
                     priv->viss_obj.input.params.width, priv->viss_obj.input.params.height,
                     priv->viss_obj.input.params.num_exposures, priv->viss_obj.input.params.format[0].msb,
                     priv->viss_obj.input.params.format[0].pixel_container);

    GST_DEBUG_OBJECT(self, "Calling tiovx_viss_module_init with DCC: %s",
                     priv->viss_obj.dcc_config_file_path);

    status = tiovx_viss_module_init(priv->context, &priv->viss_obj, &priv->sensor_obj);
    if (status != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Failed to initialize VISS module: %d", status);
        tiovx_deinit_sensor(&priv->sensor_obj);
        vxReleaseContext(&priv->context);
        appCommonDeInit();
        return FALSE;
    }

    priv->initialized = TRUE;
    GST_DEBUG_OBJECT(self, "TIOVX VISS module initialized successfully");
    return TRUE;
}

static gboolean
gst_viss_convert_create_graph(GstVissConvert *self)
{
    GstVissConvertPrivate *priv = gst_viss_convert_get_instance_private(self);
    vx_status status;
    vx_object_array raw_image_arr;

    GST_DEBUG_OBJECT(self, "Creating VISS graph");

    if (!priv->context) {
        GST_ERROR_OBJECT(self, "VX context is NULL");
        return FALSE;
    }

    priv->graph = vxCreateGraph(priv->context);
    if (vxGetStatus((vx_reference)priv->graph) != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Failed to create VISS graph");
        return FALSE;
    }

    if (!priv->viss_obj.input.image_handle[0]) {
        GST_ERROR_OBJECT(self, "Input image handle is NULL");
        return FALSE;
    }

    raw_image_arr = vxCreateObjectArray(priv->context, (vx_reference)priv->viss_obj.input.image_handle[0], 1);
    if (vxGetStatus((vx_reference)raw_image_arr) != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Failed to create raw image array");
        vxReleaseGraph(&priv->graph);
        return FALSE;
    }

    status = tiovx_viss_module_create(priv->graph, &priv->viss_obj, raw_image_arr, NULL, TIVX_TARGET_VPAC_VISS1);
    if (status != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Failed to create VISS node: %d", status);
        vxReleaseObjectArray(&raw_image_arr);
        vxReleaseGraph(&priv->graph);
        return FALSE;
    }

    status = vxVerifyGraph(priv->graph);
    if (status != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Failed to verify VISS graph: %d", status);
        vxReleaseObjectArray(&raw_image_arr);
        vxReleaseGraph(&priv->graph);
        return FALSE;
    }

    vxReleaseObjectArray(&raw_image_arr);
    GST_DEBUG_OBJECT(self, "VISS graph created successfully");
    return TRUE;
}

static gboolean
gst_viss_convert_deinit_module(GstVissConvert *self)
{
    GstVissConvertPrivate *priv = gst_viss_convert_get_instance_private(self);
    vx_status status;

    GST_DEBUG_OBJECT(self, "Deinitializing TIOVX VISS module");

    if (!priv->initialized) {
        GST_DEBUG_OBJECT(self, "Module not initialized, skipping deinit");
        return TRUE;
    }

    if (priv->viss_obj.input.image_handle[0]) {
        status = tiovx_viss_module_delete(&priv->viss_obj);
        if (status != VX_SUCCESS) {
            GST_WARNING_OBJECT(self, "Failed to delete VISS module: %d", status);
        }

        status = tiovx_viss_module_deinit(&priv->viss_obj);
        if (status != VX_SUCCESS) {
            GST_WARNING_OBJECT(self, "Failed to deinitialize VISS module: %d", status);
        }
    }

    tiovx_deinit_sensor(&priv->sensor_obj);

    if (priv->graph) {
        status = vxReleaseGraph(&priv->graph);
        if (status != VX_SUCCESS) {
            GST_WARNING_OBJECT(self, "Failed to release graph: %d", status);
        }
        priv->graph = NULL;
    }

    if (priv->context) {
        status = vxReleaseContext(&priv->context);
        if (status != VX_SUCCESS) {
            GST_WARNING_OBJECT(self, "Failed to release context: %d", status);
        }
        priv->context = NULL;
    }

    tivxHostDeInit();
    tivxDeInit();
    appCommonDeInit();

    priv->initialized = FALSE;
    GST_DEBUG_OBJECT(self, "TIOVX VISS module deinitialized successfully");
    return TRUE;
}

static gboolean
gst_viss_convert_event(GstPad *pad, GstObject *parent, GstEvent *event)
{
    GstVissConvert *self = GST_VISS_CONVERT(parent);
    GstVissConvertPrivate *priv = gst_viss_convert_get_instance_private(self);
    gboolean ret = TRUE;

    GST_DEBUG_OBJECT(self, "Handling event: %s", GST_EVENT_TYPE_NAME(event));

    switch (GST_EVENT_TYPE(event)) {
        case GST_EVENT_CAPS: {
            GstCaps *caps;
            GstStructure *structure;
            const gchar *format_str;
            gint width, height;

            gst_event_parse_caps(event, &caps);
            GST_DEBUG_OBJECT(self, "Received caps: %" GST_PTR_FORMAT, caps);

            structure = gst_caps_get_structure(caps, 0);
            format_str = gst_structure_get_string(structure, "format");
            if (!format_str) {
                GST_ERROR_OBJECT(self, "No format field in caps");
                gst_event_unref(event);
                return FALSE;
            }

            if (!gst_structure_get_int(structure, "width", &width) ||
                !gst_structure_get_int(structure, "height", &height)) {
                GST_ERROR_OBJECT(self, "No width or height in caps");
                gst_event_unref(event);
                return FALSE;
            }

            if (width < 1 || height < 1 || width > 8192 || height > 8192) {
                GST_ERROR_OBJECT(self, "Invalid width (%d) or height (%d), must be between 1 and 8192", width, height);
                gst_event_unref(event);
                return FALSE;
            }

            GST_DEBUG_OBJECT(self, "Caps: format=%s, width=%d, height=%d", format_str, width, height);

            if (g_strcmp0(format_str, "rggb") == 0 ||
                g_strcmp0(format_str, "bggr") == 0 ||
                g_strcmp0(format_str, "grbg") == 0 ||
                g_strcmp0(format_str, "gbrg") == 0) {
                priv->viss_obj.input.params.format[0].pixel_container = TIVX_RAW_IMAGE_8_BIT;
            } else {
                GST_ERROR_OBJECT(self, "Invalid Bayer format: %s", format_str);
                gst_event_unref(event);
                return FALSE;
            }

            if (!gst_video_info_from_caps(&priv->in_info, caps)) {
                GST_ERROR_OBJECT(self, "Failed to parse input caps");
                gst_event_unref(event);
                return FALSE;
            }

            if (GST_VIDEO_INFO_FORMAT(&priv->in_info) == GST_VIDEO_FORMAT_UNKNOWN) {
                GST_ERROR_OBJECT(self, "Input video format is unknown");
                gst_event_unref(event);
                return FALSE;
            }

            GstCaps *out_caps = gst_caps_new_simple("video/x-raw",
                                                   "format", G_TYPE_STRING, "NV12",
                                                   "width", G_TYPE_INT, GST_VIDEO_INFO_WIDTH(&priv->in_info),
                                                   "height", G_TYPE_INT, GST_VIDEO_INFO_HEIGHT(&priv->in_info),
                                                   "framerate", GST_TYPE_FRACTION,
                                                   GST_VIDEO_INFO_FPS_N(&priv->in_info),
                                                   GST_VIDEO_INFO_FPS_D(&priv->in_info),
                                                   NULL);

            if (!gst_pad_set_caps(self->srcpad, out_caps)) {
                GST_ERROR_OBJECT(self, "Failed to set output caps: %" GST_PTR_FORMAT, out_caps);
                gst_caps_unref(out_caps);
                gst_event_unref(event);
                return FALSE;
            }

            gst_video_info_init(&priv->out_info);
            gst_video_info_set_format(&priv->out_info, GST_VIDEO_FORMAT_NV12,
                                      GST_VIDEO_INFO_WIDTH(&priv->in_info),
                                      GST_VIDEO_INFO_HEIGHT(&priv->in_info));

            if (priv->input_pool) {
                GST_DEBUG_OBJECT(self, "Deactivating and unreferencing existing input_pool");
                gst_buffer_pool_set_active(priv->input_pool, FALSE);
                gst_object_unref(priv->input_pool);
                priv->input_pool = NULL;
            }
            if (priv->output_pool) {
                GST_DEBUG_OBJECT(self, "Deactivating and unreferencing existing output_pool");
                gst_buffer_pool_set_active(priv->output_pool, FALSE);
                gst_object_unref(priv->output_pool);
                priv->output_pool = NULL;
            }
            priv->input_pool = gst_viss_convert_create_buffer_pool(self, &priv->in_info, FALSE);
            priv->output_pool = gst_viss_convert_create_buffer_pool(self, &priv->out_info, TRUE);
            if (!priv->input_pool || !priv->output_pool) {
                GST_ERROR_OBJECT(self, "Failed to create buffer pools");
                gst_caps_unref(out_caps);
                gst_event_unref(event);
                return FALSE;
            }

            /* Initialize VISS module after caps are set */
            if (!priv->initialized) {
                GST_DEBUG_OBJECT(self, "Initializing VISS module after receiving caps");
                if (!gst_viss_convert_init_module(self)) {
                    GST_ERROR_OBJECT(self, "Failed to initialize TIOVX module after caps");
                    gst_caps_unref(out_caps);
                    gst_event_unref(event);
                    return FALSE;
                }
                if (!gst_viss_convert_create_graph(self)) {
                    GST_ERROR_OBJECT(self, "Failed to create VISS graph after caps");
                    gst_caps_unref(out_caps);
                    gst_event_unref(event);
                    return FALSE;
                }
            }

            gst_caps_unref(out_caps);
            gst_event_unref(event);
            break;
        }
        default:
            ret = gst_pad_event_default(pad, parent, event);
            break;
    }

    return ret;
}

static GstFlowReturn
gst_viss_convert_chain(GstPad *pad, GstObject *parent, GstBuffer *buffer)
{
    GstVissConvert *self = GST_VISS_CONVERT(parent);
    GstVissConvertPrivate *priv = gst_viss_convert_get_instance_private(self);
    vx_status status;
    GstBuffer *out_buffer;
    GstMemory *in_mem, *out_mem;
    GstMapInfo in_map, out_map;
    void *in_data_ptr, *out_data_ptr;
    uint32_t in_size, out_size;
    void *addr[4] = {NULL};
    uint32_t sizes[4] = {0};
    uint32_t num_entries = 0;

    GST_DEBUG_OBJECT(self, "Processing buffer in chain function");

    if (!priv->initialized || !priv->viss_obj.input.image_handle[0] || !priv->viss_obj.output2.image_handle[0]) {
        GST_ERROR_OBJECT(self, "TIOVX not initialized or image handles missing");
        gst_buffer_unref(buffer);
        return GST_FLOW_ERROR;
    }

    if (!priv->output_pool) {
        GST_ERROR_OBJECT(self, "Output pool not initialized");
        gst_buffer_unref(buffer);
        return GST_FLOW_ERROR;
    }

    if (gst_buffer_pool_acquire_buffer(priv->output_pool, &out_buffer, NULL) != GST_FLOW_OK) {
        GST_ERROR_OBJECT(self, "Failed to acquire output buffer from pool");
        gst_buffer_unref(buffer);
        return GST_FLOW_ERROR;
    }

    in_mem = gst_buffer_peek_memory(buffer, 0);
    out_mem = gst_buffer_peek_memory(out_buffer, 0);

    GST_DEBUG_OBJECT(self, "Mapping input memory");
    if (!gst_memory_map(in_mem, &in_map, GST_MAP_READ)) {
        GST_ERROR_OBJECT(self, "Failed to map input memory");
        gst_buffer_unref(out_buffer);
        gst_buffer_unref(buffer);
        return GST_FLOW_ERROR;
    }

    GST_DEBUG_OBJECT(self, "Mapping output memory");
    if (!gst_memory_map(out_mem, &out_map, GST_MAP_WRITE)) {
        GST_ERROR_OBJECT(self, "Failed to map output memory");
        gst_memory_unmap(in_mem, &in_map);
        gst_buffer_unref(out_buffer);
        gst_buffer_unref(buffer);
        return GST_FLOW_ERROR;
    }

    gsize expected_in_size = GST_VIDEO_INFO_SIZE(&priv->in_info);
    gsize expected_out_size = GST_VIDEO_INFO_SIZE(&priv->out_info);
    GST_DEBUG_OBJECT(self, "Input buffer size: %zu, expected: %zu", in_map.size, expected_in_size);
    GST_DEBUG_OBJECT(self, "Output buffer size: %zu, expected: %zu", out_map.size, expected_out_size);
    if (in_map.size < expected_in_size) {
        GST_ERROR_OBJECT(self, "Input buffer size %zu too small, expected %zu", in_map.size, expected_in_size);
        gst_memory_unmap(out_mem, &out_map);
        gst_memory_unmap(in_mem, &in_map);
        gst_buffer_unref(out_buffer);
        gst_buffer_unref(buffer);
        return GST_FLOW_ERROR;
    }
    if (out_map.size < expected_out_size) {
        GST_ERROR_OBJECT(self, "Output buffer size %zu too small, expected %zu", out_map.size, expected_out_size);
        gst_memory_unmap(out_mem, &out_map);
        gst_memory_unmap(in_mem, &in_map);
        gst_buffer_unref(out_buffer);
        gst_buffer_unref(buffer);
        return GST_FLOW_ERROR;
    }

    in_data_ptr = in_map.data;
    out_data_ptr = out_map.data;
    in_size = (uint32_t)in_map.size;
    out_size = (uint32_t)out_map.size;

    GST_DEBUG_OBJECT(self, "Importing input buffer handle to TIOVX");
    status = tivxReferenceImportHandle((vx_reference)priv->viss_obj.input.image_handle[0], (const void **)&in_data_ptr, &in_size, 1);
    if (status != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Failed to import input buffer handle: %d", status);
        gst_memory_unmap(out_mem, &out_map);
        gst_memory_unmap(in_mem, &in_map);
        gst_buffer_unref(out_buffer);
        gst_buffer_unref(buffer);
        return GST_FLOW_ERROR;
    }

    GST_DEBUG_OBJECT(self, "Importing output buffer handle to TIOVX");
    status = tivxReferenceImportHandle((vx_reference)priv->viss_obj.output2.image_handle[0], (const void **)&out_data_ptr, &out_size, 1);
    if (status != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Failed to import output buffer handle: %d", status);
        status = tivxReferenceExportHandle((vx_reference)priv->viss_obj.input.image_handle[0], addr, sizes, 4, &num_entries);
        if (status != VX_SUCCESS) {
            GST_WARNING_OBJECT(self, "Failed to export input buffer handle: %d", status);
        }
        gst_memory_unmap(out_mem, &out_map);
        gst_memory_unmap(in_mem, &in_map);
        gst_buffer_unref(out_buffer);
        gst_buffer_unref(buffer);
        return GST_FLOW_ERROR;
    }

    GST_DEBUG_OBJECT(self, "Processing VISS graph");
    status = vxProcessGraph(priv->graph);
    if (status != VX_SUCCESS) {
        GST_ERROR_OBJECT(self, "Graph processing failed: %d", status);
        status = tivxReferenceExportHandle((vx_reference)priv->viss_obj.input.image_handle[0], addr, sizes, 4, &num_entries);
        if (status != VX_SUCCESS) {
            GST_WARNING_OBJECT(self, "Failed to export input buffer handle: %d", status);
        }
        status = tivxReferenceExportHandle((vx_reference)priv->viss_obj.output2.image_handle[0], addr, sizes, 4, &num_entries);
        if (status != VX_SUCCESS) {
            GST_WARNING_OBJECT(self, "Failed to export output buffer handle: %d", status);
        }
        gst_memory_unmap(out_mem, &out_map);
        gst_memory_unmap(in_mem, &in_map);
        gst_buffer_unref(out_buffer);
        gst_buffer_unref(buffer);
        return GST_FLOW_ERROR;
    }

    GST_DEBUG_OBJECT(self, "Exporting input buffer handle");
    status = tivxReferenceExportHandle((vx_reference)priv->viss_obj.input.image_handle[0], addr, sizes, 4, &num_entries);
    if (status != VX_SUCCESS) {
        GST_WARNING_OBJECT(self, "Failed to export input buffer handle: %d", status);
    }

    GST_DEBUG_OBJECT(self, "Exporting output buffer handle");
    status = tivxReferenceExportHandle((vx_reference)priv->viss_obj.output2.image_handle[0], addr, sizes, 4, &num_entries);
    if (status != VX_SUCCESS) {
        GST_WARNING_OBJECT(self, "Failed to export output buffer handle: %d", status);
    }

    gst_memory_unmap(out_mem, &out_map);
    gst_memory_unmap(in_mem, &in_map);

    gst_buffer_copy_into(out_buffer, buffer, GST_BUFFER_COPY_METADATA, 0, -1);

    GST_DEBUG_OBJECT(self, "Pushing output buffer");
    gst_buffer_unref(buffer);
    return gst_pad_push(self->srcpad, out_buffer);
}

static GstStateChangeReturn
gst_viss_convert_change_state(GstElement *element, GstStateChange transition)
{
    GstVissConvert *self = GST_VISS_CONVERT(element);
    GstVissConvertPrivate *priv = gst_viss_convert_get_instance_private(self);
    GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;

    GST_DEBUG_OBJECT(self, "Changing state: %s",
                    gst_state_change_get_name(transition));

    switch (transition) {
    case GST_STATE_CHANGE_NULL_TO_READY:
        if (!gst_viss_convert_init_module(self)) {
            GST_ERROR_OBJECT(self, "Failed to initialize module");
            return GST_STATE_CHANGE_FAILURE;
        }
        priv->initialized = TRUE;
        break;
    case GST_STATE_CHANGE_READY_TO_PAUSED:
        // Fixed: Use direct struct access instead of pointer
        if (GST_VIDEO_INFO_FORMAT(&priv->in_info) == GST_VIDEO_FORMAT_UNKNOWN ||
            GST_VIDEO_INFO_FORMAT(&priv->out_info) == GST_VIDEO_FORMAT_UNKNOWN) {
            GST_ERROR_OBJECT(self, "Input or output info not set");
            return GST_STATE_CHANGE_FAILURE;
        }
        GST_DEBUG_OBJECT(self, "READY -> PAUSED: in_info.format=%d, width=%d, height=%d",
                         GST_VIDEO_INFO_FORMAT(&priv->in_info),
                         GST_VIDEO_INFO_WIDTH(&priv->in_info),
                         GST_VIDEO_INFO_HEIGHT(&priv->in_info));
        if (!gst_viss_convert_create_graph(self)) {
            GST_ERROR_OBJECT(self, "Failed to create graph");
            return GST_STATE_CHANGE_FAILURE;
        }
        break;
    case GST_STATE_CHANGE_PAUSED_TO_READY:
        if (priv->graph) {
            vxReleaseGraph(&priv->graph);
            priv->graph = NULL;
        }
        // Fixed: Use correct pool names (output_pool instead of out_pool)
        if (priv->output_pool) {
            gst_object_unref(priv->output_pool);
            priv->output_pool = NULL;
        }
        break;
    case GST_STATE_CHANGE_READY_TO_NULL:
        if (priv->initialized) {
            tiovx_viss_module_deinit(&priv->viss_obj);
            tiovx_deinit_sensor(&priv->sensor_obj);
            if (priv->context) {
                vxReleaseContext(&priv->context);
            }
            appCommonDeInit();
            priv->initialized = FALSE;
        }
        break;
    default:
        break;
    }

    ret = GST_ELEMENT_CLASS(gst_viss_convert_parent_class)->change_state(element, transition);
    return ret;
}


static gboolean
plugin_init(GstPlugin *plugin)
{
    // Add debug category initialization
    GST_DEBUG_CATEGORY_INIT(gst_viss_convert_debug_category, "vissconvert", 0,
                            "TI VISS Convert");
    // Add return statement
    return gst_element_register(plugin, "vissconvert", GST_RANK_NONE,
                        GST_TYPE_VISS_CONVERT);
}

GST_PLUGIN_DEFINE(
    GST_VERSION_MAJOR,
    GST_VERSION_MINOR,
    vissconvert,
    "VISS Convert Plugin with Buffer Pooling and DCC Support",
    plugin_init,
    "1.0",
    "LGPL",
    "GStreamer",
    "http://gstreamer.net/"
)


I have attached my code of the plugin developed above for your reference. Is there any guide that would help me to develop tiovx plugins?

Thanks in advance,

Regards,

Sriram