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.

dm8127用dcc抓取一帧,需要做什么样的设置吗?

为什么我抓取的是这样的呢?1080p YUV420SPUV,哪位老大帮帮忙,

  • 但是抓取raw的图像是正常的

  • 你网页里面看的到正常的图像吗

  • 嗯,从web看到的图像都是正常的,我从代码里看到是设置yuv420sp-uv的格式;

    而且从dcc抓取的raw也是没问题,至少是有图像的;

    但是抓取yuv后,用yuvplayer放就是这种情况;

    不知道什么原因,我看了linker的代码,是从调用这个函数FVID2_control获取的数据,这个函数应该是汇编在m3vpss上实现的吧,我还没往下追,汇编不懂了。

    我这个情况是dcc设置问题,还是目标板的配置问题? 请帮我分析一下,谢谢

  • TI和appro的代码我没动,是rdk3.5的,sensor用的ar0331,这个跟这个dcc抓取yuv有关系吗?

    总感觉在m3vpss对raw向yuv处理的时候是不是需要注意配置?

    或者dcc使用有注意的方法?

    另:::我打开yuv看了0x0-0x8b80字节数据是0x80对yuv文件来说正常吗(而且每张都是)?

  • 大师,请点拨一二

  • Eason Wang 说:

    你网页里面看的到正常的图像吗

    刚刚询问了一位仁兄,他说image应该是1952x1080,我试过,问题得不到解决

  • 这是图像尺寸没有设定好。

    你把YUV数据的pitch打印出来。

  • hi,我的打印信息是[m3vpss ] Input Channel CH0 of 1952 x 1112, pitch = (1984, 1984) [0,0][PROGRESSIVE] [7] ...,这个有什么问题吗?我对这个不太懂,

    如果需要调整在哪个模块中调整?

    我用messageQ从m3vpss得到的buffer大小直接就是1920*1080*3/2的大小

    谢谢

  • 这个的调整是不是位于mcfw层面的?app层没有发现对这个的设置

  • 以下是vpss上的获取yuv部分,看源代码是直接从一个接口取得一个buffer,没有区分y和uv,源代码注掉了uv的部分,还没弄懂其底层如何实现,故不敢妄加揣测

    else if (cmd == CMD_SAVE_YUV)
    {
    if (buf == NULL)
    {
    Vps_rprintf("Buffer is null can not trasmit the YUV data \n");
    ittMsg->response = 0;
    }
    else
    {

    int chunk = 0;
    int capHorLineOffset,capVertLineOffset;
    CameraLink_Obj *pObj;
    CameraLink_VipInstParams *pInstPrm;
    CameraLink_OutParams *pOutPrm;
    pObj = &gCameraLink_obj;
    pInstPrm = &pObj->createArgs.vipInst[0];
    pOutPrm = &pInstPrm->outParams[0];

    capHorLineOffset = pOutPrm->scOutWidth;
    capVertLineOffset = pOutPrm->scOutHeight;

    if(gVstabEnable == 1)
    {
    capHorLineOffset = (pOutPrm->scOutWidth * VSTAB_SCALE_NUMERATOR)/VSTAB_SCALE_DENOMINATOR;
    capVertLineOffset = (pOutPrm->scOutHeight * VSTAB_SCALE_NUMERATOR)/VSTAB_SCALE_DENOMINATOR;
    }

    if (pOutPrm->dataFormat == FVID2_DF_YUV420SP_UV || pOutPrm->dataFormat == FVID2_DF_YUV420SP_VU){
    YUVDumpSize = (((capHorLineOffset) * capVertLineOffset) * 3)/2;
    }
    else if (pOutPrm->dataFormat == FVID2_DF_YUV422I_UYVY ||
    pOutPrm->dataFormat == FVID2_DF_YUV422I_YUYV ||
    pOutPrm->dataFormat == FVID2_DF_YUV422I_YVYU ||
    pOutPrm->dataFormat == FVID2_DF_YUV422I_VYUY ||
    pOutPrm->dataFormat == FVID2_DF_BAYER_RAW){
    YUVDumpSize = ((capHorLineOffset) * capVertLineOffset) * 2;
    }
    char *yuv_buf = (char *) captureBuff_Y[0];

    int remaining_size = (int) YUVDumpSize;

    int max_transfer_size = 1000 * 1024;

    Vps_rprintf("Requesing to dump the YUV data \n");
    yuv_data_ready = 0;
    request_yuv_data = 1;
    Vps_rprintf("Trasmitting the YUV data \n");
    if (pObj->createArgs.captureMode == CAMERA_LINK_CAPMODE_ISIF)
    {
    // DEBUG
    Iss_IttParams ittParams;

    ittParams.Raw_Data_Ready = 0;
    /* wait till isr of isif dumps the raw data */
    ittParams.ittCommand = cmd;
    ittParams.isif_dump = (UInt32 *)captureBuff_Y[0];
    status =
    FVID2_control(pInst->cameraVipHandle,
    IOCTL_ISS_ALG_ITT_CONTROL, &ittParams, NULL);
    if (status != FVID2_SOK)
    {
    Vps_rprintf("YUV capture dump failed!\n");
    return ;
    }

    while (ittParams.Raw_Data_Ready == 0)
    {
    Task_sleep(100);
    }
    }
    else
    {
    while (yuv_data_ready == 0)
    {
    Task_sleep(100);
    }
    }

    do // for (chunk = 0;
    //
    // chunk < 3;
    // chunk++)
    {
    int bytes_to_trasfer =
    (remaining_size >
    max_transfer_size) ? max_transfer_size :
    remaining_size;
    Vps_rprintf("Transmitting chunk %d bytes remaining = %d \n",
    chunk, remaining_size);
    char *shared_buf = (char *) buf;

    memcpy(shared_buf, yuv_buf, bytes_to_trasfer);
    yuv_buf += bytes_to_trasfer;
    ittMsg->arg1 = bytes_to_trasfer;
    ittMsg->response = 1;
    Vps_rprintf("Sending the reply message \n");
    /*----------------------------------------------------------------------
    * Send the response back to the client module
    *--------------------------------------------------------------------*/
    if(msg != NULL)
    {
    status = MessageQ_put(sender, (MessageQ_Msg) msg);
    UTILS_assert(status == MessageQ_S_SUCCESS);
    }
    // Get
    status =
    MessageQ_get(hDccMsgQ, (MessageQ_Msg *) & msg,
    MessageQ_FOREVER);
    Vps_rprintf("Got the acknowledgement \n");
    UTILS_assert(status == MessageQ_S_SUCCESS);
    remaining_size -= bytes_to_trasfer;
    chunk++;
    } while (remaining_size > 0);
    #if 0
    yuv_buf = (UInt8 *) captureBuff_C[0];
    remaining_size = (int) YUVDumpSize / 2;
    do
    {
    int bytes_to_trasfer =
    (remaining_size >
    max_transfer_size) ? max_transfer_size :
    remaining_size;
    Vps_rprintf("Transmitting chunk %d bytes remaining = %d \n",
    chunk, remaining_size);
    char *shared_buf = (char *) buf;

    memcpy(shared_buf, yuv_buf, bytes_to_trasfer);
    yuv_buf += bytes_to_trasfer;
    ittMsg->arg1 = bytes_to_trasfer;
    ittMsg->response = 1;
    Vps_rprintf("Sending the reply message \n");
    /*----------------------------------------------------------------------
    * Send the response back to the client module
    *--------------------------------------------------------------------*/
    if(msg != NULL)
    {
    status = MessageQ_put(sender, (MessageQ_Msg) msg);
    UTILS_assert(status == MessageQ_S_SUCCESS);
    }
    // Get
    status =
    MessageQ_get(hDccMsgQ, (MessageQ_Msg *) & msg,
    MessageQ_FOREVER);
    Vps_rprintf("Got the acknowledgement \n");
    UTILS_assert(status == MessageQ_S_SUCCESS);
    remaining_size -= bytes_to_trasfer;
    chunk++;
    } while (remaining_size > 0);
    #endif

    ittMsg->arg1 = -1;
    ittMsg->response = 1;
    if(msg != NULL)
    {
    status = MessageQ_put(sender, (MessageQ_Msg) msg);
    UTILS_assert(status == MessageQ_S_SUCCESS);
    }
    }
    }

  • 可以提供点思路给你。

    1,像素都为0x80是正常的,因为开始几行没有图像信息,是空白行。

    2,图像大小并不是1920X1080。我是把图像传给A8再保存为YUV,真实大小为pitchXheight,所以你必须想办法把pitch与height的值弄清楚。

  • changquan wang 说:

    可以提供点思路给你。

    1,像素都为0x80是正常的,因为开始几行没有图像信息,是空白行。

    2,图像大小并不是1920X1080。我是把图像传给A8再保存为YUV,真实大小为pitchXheight,所以你必须想办法把pitch与height的值弄清楚。

    好的谢谢,马上实验

  • 0x80表示的是空数据。如果整个yuv都是0x80是有问题的。

    不过看起来你的yuv的下半部分是有图像的,

    推荐你一个7yuv的工具,你可以动态的修改pitch调整到你图像有意义为止。

    然后反过头来推测为什么会是个大小。

  • 好的,我那个只是0-0x8b80是0x80,我用那个软件试试,谢谢

  • 请问dcc是怎么使用呢,我想用它看寄存器值。

  • 和8127在同一个局域网中,直接输入ip就可以连接上看的,8127软件中有一个itt服务程序就是为dcc服务的