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.

[参考译文] TDA4AL-Q1:前两帧中的颜色图像错误

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1511112/tda4al-q1-wrong-color-image-in-first-two-frame

器件型号:TDA4AL-Q1

工具/软件:

您好、TI 专家、

启动时、我们发现在运行单摄像头应用程序时出现颜色错误问题。

在 app_run_graph 的函数中、我们找到如下注释

/*
The application reads and processes the same image "frm_loop_cnt" times
The output may change because on VISS, parameters are updated every frame based on AEWB results
AEWB result is avaialble after 1 frame and is applied after 2 frames
Therefore, first 2 output images will have wrong colors
*/

我们还通过 CSI TX 在三次转储帧之前转储帧、如下所示。

帧1

第2帧

第3帧

那么、为了避免该问题、您是否有跳过帧机制?

或者如何实现该跳跃帧函数呢?

谢谢、

YL

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

    尊敬的 YL:

    从 H/W 角度来看、在前2个帧中、AWB 增益和 GLBCE 上下文尚无效或不可用。
    您可能已跳过显示的前2帧。

    复制我的朋友 Brijesh Jadav 对跳跃软件实现的评论。

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

    尊敬的 YL:

    一种可能是在 DSS 中跳过这些帧。 在 DSS 节点的进程函数中、可以忽略前两个帧、然后将其返回到框架。 在 第三个帧之后、您可以将该帧提交给 DSS。  

    但请注意、这不受支持、因此未经验证。  

    此致、

    Brijesh

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

    您好、Brijesh、

    感谢您的答复。

    那么、您能在 DSS 端提供一些检查点来进行调试吗?

    谢谢、

    YL

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

    尊敬的 YL:

    在 video_io 文件夹中应用以下补丁并重新编译 SDK、

    diff --git a/kernels/include/TI/video_io_csitx.h b/kernels/include/TI/video_io_csitx.h
    index f3aa978..7156113 100644
    --- a/kernels/include/TI/video_io_csitx.h
    +++ b/kernels/include/TI/video_io_csitx.h
    @@ -288,6 +288,7 @@ typedef struct
         uint32_t numCh; /*!< Number of channels to be processed on current instance of Node */
         uint32_t chVcNum[TIVX_CSITX_MAX_CH]; /*!< Virtual Channel Number for each channel */
         uint32_t chInstMap[TIVX_CSITX_MAX_CH]; /*!< Instance ID for each channel */
    +    uint32_t skip_frame; /*!< Number of frames to be skipped at beginning */
     } tivx_csitx_params_t;
     
     /*!
    diff --git a/kernels/include/TI/video_io_display.h b/kernels/include/TI/video_io_display.h
    index f7c22ca..931ef0f 100755
    --- a/kernels/include/TI/video_io_display.h
    +++ b/kernels/include/TI/video_io_display.h
    @@ -172,6 +172,7 @@ typedef struct {
         uint32_t  posY;        /*!< Y position of the video buffer */
         uint32_t  enableCropping; /*!< Flag to enable cropping */
         tivx_display_crop_params_t cropPrms; /*!< Crop parameters */
    +    uint32_t skip_frame; /*!< Number of frames to be skipped at beginning */
     } tivx_display_params_t;
     
     /*! \brief Channels parameters for selecting channel to be displayed.
    diff --git a/kernels/video_io/csitx/vx_csitx_target.c b/kernels/video_io/csitx/vx_csitx_target.c
    index 97b0cd2..8c687d7 100644
    --- a/kernels/video_io/csitx/vx_csitx_target.c
    +++ b/kernels/video_io/csitx/vx_csitx_target.c
    @@ -135,6 +135,7 @@ struct tivxCsitxParams_t
         /**< pending frame queue mem */
         Fvid2_FrameList frmList;
         /* Make frame list instance specific */
    +    uint32_t skip_frame;
     };
     
     static char target_name[][TIVX_TARGET_MAX_NAME] =
    @@ -469,7 +470,7 @@ static vx_status tivxCsitxSetCreateParams(
             (vx_enum)VX_MEMORY_TYPE_HOST, (vx_enum)VX_READ_ONLY));
     
         params = (tivx_csitx_params_t *)csitx_config_target_ptr;
    -
    +    prms->skip_frame = params->skip_frame;
         /* Scan through all the channels provided in the Node instance and prepare CSITX DRV instance data/cfg */
         for (chIdx = 0U ; chIdx < params->numCh ; chIdx++)
         {
    @@ -628,6 +629,12 @@ static vx_status VX_CALLBACK tivxCsitxProcess(
         if((vx_status)VX_SUCCESS == status)
         {
     
    +        if(prms->skip_frame != 0 ) 
    +        {
    +            prms->skip_frame--;
    +        }
    +        else
    +        {
             /* Steady state: provides a buffer and receives a buffer */
             if ((vx_enum)VX_NODE_STATE_STEADY == state)
             {
    @@ -753,6 +760,7 @@ static vx_status VX_CALLBACK tivxCsitxProcess(
             {
                 status = tivxCsitxEnqueueFrameToDriver(input_desc, prms);
             }
    +        }
         }
     
         return status;
    diff --git a/kernels/video_io/display/vx_display_target.c b/kernels/video_io/display/vx_display_target.c
    index 68f398a..420aee7 100755
    --- a/kernels/video_io/display/vx_display_target.c
    +++ b/kernels/video_io/display/vx_display_target.c
    @@ -131,6 +131,7 @@ typedef struct
         uint32_t offset0;
         uint32_t offset1;
         tivx_display_crop_params_t cropPrms;
    +    uint32_t skip_frame;
         uint32_t bpp;
     
         uint32_t isRtPrmsUpdated;
    @@ -528,6 +529,7 @@ static vx_status VX_CALLBACK tivxDisplayCreate(
                 displayParams->firstFrameDisplay = UTRUE;
                 displayParams->cbParams.cbFxn = (Fvid2_CbFxn) (&tivxDisplayCallback);
                 displayParams->cbParams.appData = displayParams;
    +            displayParams->skip_frame = params->skip_frame;
                 appRtosSemaphoreParamsInit(&semParams);
                 semParams.mode = APP_RTOS_SEMAPHORE_MODE_BINARY;
                 semParams.initValue = 0U;
    @@ -979,6 +981,12 @@ static vx_status VX_CALLBACK tivxDisplayProcess(
     
             if(TIVX_KERNEL_DISPLAY_ZERO_BUFFER_COPY_MODE == displayParams->opMode)
             {
    +            if(displayParams->skip_frame != 0 ) 
    +            {
    +                displayParams->skip_frame--;
    +            }
    +            else
    +            {    
                 /* Get frame from queue */
                 tivxQueueGet(&displayParams->fvid2FrameQ, (uintptr_t*)&frm, TIVX_EVENT_TIMEOUT_NO_WAIT);
                 if(NULL != frm)
    @@ -1063,6 +1071,7 @@ static vx_status VX_CALLBACK tivxDisplayProcess(
                         VX_PRINT(VX_ZONE_ERROR, "DISPLAY: ERROR: Dequeue operation failed!\r\n");
                     }
                 }
    +            }
             }
             else if(TIVX_KERNEL_DISPLAY_BUFFER_COPY_MODE == displayParams->opMode)
             {

    在从应用程序初始化期间更新 dipslay_params 中的 skip_frame 参数

    例如:"local_csitx_config.skip_frame = 3;"(对于 csitx)。

    这将设置开始时要跳过的帧数、该补丁同时适用于显示节点和 csitx 节点。

    此致、
    Gokul

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

    尊敬的 Gokul:

    感谢您的大力支持。

    我来尝试这个补丁。

    谢谢、

    YL

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

    尊敬的 YL:

    当然、我会等待您的反馈。

    此致、
    Gokul