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, ¶ms);
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