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.
嗯,从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文件来说正常吗(而且每张都是)?
hi,我的打印信息是[m3vpss ] Input Channel CH0 of 1952 x 1112, pitch = (1984, 1984) [0,0][PROGRESSIVE] [7] ...,这个有什么问题吗?我对这个不太懂,
如果需要调整在哪个模块中调整?
我用messageQ从m3vpss得到的buffer大小直接就是1920*1080*3/2的大小
谢谢
以下是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调整到你图像有意义为止。
然后反过头来推测为什么会是个大小。