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.

[FAQ] [参考译文] 【常见问题解答】TDA4VM:VPU 驱动程序中的哪些参数用于设置 I 帧和 IDR 关键帧周期?

Guru**** 2573765 points
Other Parts Discussed in Thread: TDA4VM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1573938/faq-tda4vm-what-parameters-in-the-vpu-driver-are-used-for-setting-i-frame-and-idr-key-frame-period

器件型号:TDA4VM


工具/软件:

我正在使用 TDA4VM Linux 或 Linux+RTOS 8.6 SDK。 哪些参数或增补程序可用于启用 I 帧周期和 IDR 帧周期?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 8.6 SDK 中、Imagination VPU GStreamer 到 V4L2 控件未启用、仅在 9.0 中启用。 您仍然可以通过在 8.6 版驱动程序中对参数进行硬编码来启用 I 帧周期。 对进行了以下修改 vxe_v4l2.c  将 I 帧/IDR 周期设置为 5。

    •  在中  vxe_s_ext_CtrlS  原理图  V4L2_CID_MPEG_VIDEO_H264_I_PERIOD  用例、修改  CTX->RC。 intra_freq = 5   CTX->vparams.intra_cnt = 5.  要使每 5 个帧成为 I 帧:

    static int vxe_s_ext_ctrls(struct file *file, void *priv,
    			   struct v4l2_ext_controls *ctrls)
    {
    	struct vxe_enc_ctx *ctx = file2ctx(file);
    	struct device *dev = ctx->dev->dev;
    	int i;
    	int ret;
    
    	ctrls->reserved[0] = 0;
    	ctrls->reserved[1] = 0;
    
    	if (ctrls->which != V4L2_CTRL_WHICH_CUR_VAL)
    		return -EINVAL;
    
    	/* Verify first with try_ext_ctrls */
    	ret = vxe_try_ext_ctrls(file, priv, ctrls);
    	if (ret) {
    		/* Indicate verification stage error */
    		ctrls->error_idx = ctrls->count;
    		return ret;
    	}
    
    	/* Set all values in this set of commands */
    	for (i = 0; i < ctrls->count; i++) {
    		ctrls->controls[i].reserved2[0] = 0;
    
    		switch (ctrls->controls[i].id) {
    		case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
    			ctrls->controls[i].size = 0;
    			ctx->vparams.idr_period = 5;
    			break;
    		case V4L2_CID_MPEG_VIDEO_BITRATE:
    			ctrls->controls[i].size = 0;
    			ctx->rc.bits_per_second = ctrls->controls[i].value;
    			break;
    		case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD:
    			ctrls->controls[i].size = 0;
    			ctx->rc.intra_freq = 5;
    			ctx->vparams.intra_cnt = 5;
    			break;
    		default:
    			dev_err(dev, "%s Invalid control id %#08x\n",
    				__func__, ctrls->controls[i].id);
    			ctrls->error_idx = i;
    			return -EINVAL;
    		}
    	}
    
    	return 0;
    }

    • 要设置 IDR 关键帧周期、您将使用设置上述参数和 GOP  Ctx->vparams.idr_period = 5 在下 V4L2_CID_MPEG_VIDEO_GOP_SIZE  以使每 5 帧成为关键帧。

    由于用户空间 API 未正确实现以由 5.10 (8.6 SDK) 内核中的 GStreamer 控制。 我将附加在 6.1 (9.0 SDK) 内核中创建的补丁、该补丁添加了此实现以从下面的 GStreamer 设置 V4L2 控件:

    0268.tiL6.1-1-2-media-img-vxe-vxd-enable-Gstreamer-1.20.5.patch

    有了这个补丁、您应该能够避免硬编码以及驱动程序中的值、而只使用 GStreamer 流水线插件。 但是、由于此补丁是在较新的内核上实现的、因此 TI 不确定涉及哪些(如果有)反向移植工作。

    此致、
    Sarabesh S.