How to add custom controls to gst-launch nvarguscamera?

Dear Community,

In our custom camera driver, we have following custom controls :

nvidia@ngx007-1819-xaviernx:~$ v4l2-ctl --list-ctrls-menus -d /dev/video0

Camera Controls

                 streaming_mode 0x009a2071 (menu)   : min=0 max=2 default=0 value=0
				0: Standalone
				1: Sync Mode
				2: External HW Sync Mode
                 operation_mode 0x009a2072 (menu)   : min=0 max=1 default=0 value=0
				0: Master Mode
				1: Slave Mode
                    black_level 0x009a2075 (int64)  : min=0 max=511 step=1 default=60 value=60 flags=slider, execute-on-write
            global_shutter_mode 0x009a207b (menu)   : min=0 max=1 default=0 value=0
				0: Normal Mode
				1: Sequential Trigger Mode
                   sensor_modes 0x009a2082 (int)    : min=0 max=30 step=1 default=30 value=5 flags=read-only

nvidia@ngx007-1819-xaviernx:~$ v4l2-ctl --list-ctrls-menus -d /dev/video1

Camera Controls

                 streaming_mode 0x009a2071 (menu)   : min=0 max=2 default=0 value=0
				0: Standalone
				1: Sync Mode
				2: External HW Sync Mode
                 operation_mode 0x009a2072 (menu)   : min=0 max=1 default=0 value=0
				0: Master Mode
				1: Slave Mode
                    black_level 0x009a2075 (int64)  : min=0 max=511 step=1 default=60 value=60 flags=slider, execute-on-write
            global_shutter_mode 0x009a207b (menu)   : min=0 max=1 default=0 value=0
				0: Normal Mode
				1: Sequential Trigger Mode
                   sensor_modes 0x009a2082 (int)    : min=0 max=30 step=1 default=30 value=5 flags=read-only

I updated some controls (operation mode and streaming mode) :

nvidia@ngx007-1819-xaviernx:~$ v4l2-ctl -c streaming_mode=1 -d /dev/video0

nvidia@ngx007-1819-xaviernx:~$ v4l2-ctl -c streaming_mode=1 -d /dev/video1
nvidia@ngx007-1819-xaviernx:~$ v4l2-ctl -c operation_mode=1 -d /dev/video1

nvidia@ngx007-1819-xaviernx:~$ v4l2-ctl --list-ctrls-menus -d /dev/video0

Camera Controls

                 streaming_mode 0x009a2071 (menu)   : min=0 max=2 default=0 value=1
				0: Standalone
				1: Sync Mode
				2: External HW Sync Mode
                 operation_mode 0x009a2072 (menu)   : min=0 max=1 default=0 value=0
				0: Master Mode
				1: Slave Mode
                    black_level 0x009a2075 (int64)  : min=0 max=511 step=1 default=60 value=60 flags=slider, execute-on-write
            global_shutter_mode 0x009a207b (menu)   : min=0 max=1 default=0 value=0
				0: Normal Mode
				1: Sequential Trigger Mode
                   sensor_modes 0x009a2082 (int)    : min=0 max=30 step=1 default=30 value=5 flags=read-only


nvidia@ngx007-1819-xaviernx:~$ v4l2-ctl --list-ctrls-menus -d /dev/video1 

Camera Controls

                 streaming_mode 0x009a2071 (menu)   : min=0 max=2 default=0 value=1
				0: Standalone
				1: Sync Mode
				2: External HW Sync Mode
                 operation_mode 0x009a2072 (menu)   : min=0 max=1 default=0 value=1
				0: Master Mode
				1: Slave Mode
                    black_level 0x009a2075 (int64)  : min=0 max=511 step=1 default=60 value=60 flags=slider, execute-on-write
            global_shutter_mode 0x009a207b (menu)   : min=0 max=1 default=0 value=0
				0: Normal Mode
				1: Sequential Trigger Mode
                   sensor_modes 0x009a2082 (int)    : min=0 max=30 step=1 default=30 value=5 flags=read-only

The modes get updated but are NOT propagated to low-level sensor driver, however. Below are relevant callbacks in the sensor driver :

static const u32 ctrl_cid_list[] = {
	TEGRA_CAMERA_CID_GAIN,
	TEGRA_CAMERA_CID_EXPOSURE,
	TEGRA_CAMERA_CID_FRAME_RATE,
	TEGRA_CAMERA_CID_SENSOR_MODE_ID,
    TEGRA_CAMERA_CID_STREAMING_MODE,
    TEGRA_CAMERA_CID_OPERATION_MODE,
    TEGRA_CAMERA_CID_BLACK_LEVEL,
    TEGRA_CAMERA_CID_SHUTTER_MODE,
    TEGRA_CAMERA_CID_TEST_PATTERN,
};
...
/**
 * Set streaming mode 
 */
static int imxXXX_set_streaming_mode(struct tegracam_device *tc_dev, u32 val)
{
	struct imxXXX *priv = (struct imxXXX *)tc_dev->priv;
	struct device *dev = tc_dev->dev;

    priv->current_streaming_mode = val;

	dev_dbg(dev, "%s: mode = %d\n", __func__, priv->current_streaming_mode);

    return 0;
}

/**
 * Set operation mode of sensor 
 */
static int imxXXX_set_operation_mode(struct tegracam_device *tc_dev, u32 val)
{
	struct imxXXX *priv = (struct imxXXX *)tc_dev->priv;
	struct device *dev = tc_dev->dev;

    priv->current_operation_mode = val;

	dev_dbg(dev, "%s: mode = %d\n", __func__, priv->current_operation_mode);

    return 0;
}
...
static struct tegracam_ctrl_ops imxXXX_ctrl_ops = {
	.numctrls = ARRAY_SIZE(ctrl_cid_list),
	.ctrl_cid_list = ctrl_cid_list,
	.set_gain = imxXXX_set_gain,
	.set_exposure = imxXXX_set_exposure,
	.set_frame_rate = imxXXX_set_frame_rate,
	.set_group_hold = imxXXX_set_group_hold,
    .set_test_pattern = imxXXX_set_test_pattern,
    .set_streaming_mode = imxXXX_set_streaming_mode,
    .set_operation_mode = imxXXX_set_operation_mode,
    .set_black_level = imxXXX_set_black_level,
    .set_shutter_mode = imxXXX_set_shutter_mode,
};

I would like to know if I could add these custom controls to gst-launch command for nvarguscamera, please ?

Best Regards.
Khang

Probably the way to go would be rebuilding nvarguscamera gstreamer plugin.
You would download the public sources for your L4T version such as here for R35.1.
You would get the plugin sources from Linux_for_Tegra/source/public/gst-nvarguscamera_src.tbz2
You may add properties to nvarguscamerasrc element for managing extra controls from gstreamer.

Hi @Honey_Patouceul ,

Thanks for your idea. Currently I can get it work with v4l2-ctl command from v4l-utils with the extension for custom/specific controls in <path-to-kernel_src>/kernel/nvidia/drivers/media/platform/tegra/camera/tegracam_ ***. Only attention is that if the expected value(s) is / are same as default value(s) of this intermediate layer (v4l2), relevant callback(s) would NOT be called thus expected value(s) would NOT be propagated to low-level driver even-though the expected value(s) in user-space and internal value(s) in lower-level driver of same control(s) could be different.

Regards,
Khang

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.