您的位置:首页 > 其它

seed-dvs6467 encodedecode实例 采集的图像质量很差,只有隔行显示,而且每帧图像不断的往下移动?

2013-12-31 16:25 344 查看
问题:采集的图像质量很差,只有隔行显示,而且每帧图像不断的往下移动?

初步判断是奇偶场图像没有合成成一个完整的帧图像。本人尝试设置成奇偶场的格式(fmt.fmt.pix.field = V4L2_FIELD_INTERLACED),但是mv_pro_4.0.1内核不支持。

1:开发环境

2:移植步骤

3:采集显示的图片

4:超级终端打印信息

1、开发环境
开发板:seed-dvs6467 v1.0

开发环境:ubuntu12.04

TI 软件包:dvsdk_1_40_02_33

内核版本:mv_pro_4.0.1(seed公司修改了相关的驱动)

运行实例: encodedecode

移植ti dvsdk_demos_for_evm6467 目录下的encodedecode 到seed-dvs6467 v1.0

2、移植步骤:
2.1、在内核mv_pro_4.0.1\montavista\pro\devkit\lsp\ti-davinci\linux-2.6.10_mvl401_LSP_01_30_00_082\drivers\media\video\davinci目录下,davincihd_capture.c文件中修改void vpif_get_std_info函数,然后重新编译内核(make uImage)。

static void vpif_get_std_info(struct channel_obj *ch)
{
// struct decoder_device *dec = ch->decoder[ch->current_decoder];
struct video_obj *vid_ch = &(ch->video);
// struct v4l2_standard standard;
// int index = 0, ret;
int ret;
vid_ch->std_info.channel_id = ch->channel_id;
/* Get standard name from the decoder by enumerating standards */
if(vid_ch->std==TVP5158_STD_PAL_13)
{
strncpy(vid_ch->std_info.name, "TVP5158_PAL_13",
sizeof(vid_ch->std_info.name));
strncpy(ch->vpifparams.video_params.name,
"TVP5158_PAL_13", sizeof(vid_ch->std_info.name));
}
else
{
strncpy(vid_ch->std_info.name, "TVP5158_NTSC_13",
sizeof(vid_ch->std_info.name));
strncpy(ch->vpifparams.video_params.name,
"TVP5158_NTSC_13", sizeof(vid_ch->std_info.name));
}
/* Get standard information from VPIF layer */
/*changed the height from 2500 to 576  ,width from 712 to 720 by zhangzhonghua */
ret = vpif_get_mode_info(&vid_ch->std_info);
ch->common[VPIF_VIDEO_INDEX].fmt.fmt.pix.width =
ch->common[VPIF_VIDEO_INDEX].width = 720;
if(vid_ch->std==TVP5158_STD_PAL_13)
{
ch->common[VPIF_VIDEO_INDEX].fmt.fmt.pix.height =
ch->common[VPIF_VIDEO_INDEX].height = 576;
}
else
{
ch->common[VPIF_VIDEO_INDEX].fmt.fmt.pix.height =
ch->common[VPIF_VIDEO_INDEX].height = 2100;
}
ch->common[VPIF_VIDEO_INDEX].fmt.fmt.pix.bytesperline =720;
ch->vpifparams.video_params.hpitch = 720;
ch->vpifparams.video_params.storage_mode =1;
}


2.2、把\dvsdk_demos_for_evm6467\dm6467\encodedecode 目录下capture.c 文件的VideoStd_720P_50替换成VideoStd_D1_PAL 格式

2.3、把dmai_1_10_00_06\packages\ti\sdo\dmai\linux 目录下capture.c

首先添加头文件#include <media/davinci/tvp5158.h>

然后修改Capture_detectVideoStd;

/******************************************************************************
* Capture_detectVideoStd
******************************************************************************/
Int Capture_detectVideoStd(Capture_Handle hCapture, VideoStd_Type *videoStdPtr,
Capture_Attrs *attrs)
{
Int                failCount  =  0;
Int                firstInput;
Int                queryInput;
struct v4l2_input  v4l2Input;
v4l2_std_id        std;
Int                input;
Int                fd;
Int                ret;
assert(videoStdPtr);
assert(attrs);
/*
* Initialize variables outside of variable declarations to suppress
* "unused variable" warnings for platforms that don't use them.
*/
Dmai_clear(v4l2Input);
queryInput =  0;
firstInput = -1;
if (hCapture) {
fd = hCapture->fd;
}
else {
fd = open(attrs->captureDevice, O_RDWR, 0);
if (fd == -1) {
Dmai_err2("Cannot open %s (%s)\n", attrs->captureDevice,
strerror(errno));
return Dmai_EFAIL;
}
}
#ifdef Dmai_Device_dm6467
/*changed by zhangzhonghua in 2013-12-27*/
//把下面的注释掉,直接调用ioctl(fd, VIDIOC_S_STD, &std)设置
/*
do {
if (ioctl(fd, VIDIOC_G_INPUT, &input) == -1) {
Dmai_err0("Failed GET_INPUT. No inputs connected?\n");
return Dmai_EFAIL;
}
if (firstInput < 0) {
firstInput = input;
}
else if (firstInput == input) {
//We have cycled through all inputs with no match
Dmai_err1("%s input not found\n",
captureInputString[attrs->videoInput]);
return Dmai_EFAIL;
}
v4l2Input.index = input;
if (ioctl(fd, VIDIOC_ENUMINPUT, &v4l2Input) == -1) {
Dmai_err1("%s input not found\n",
captureInputString[attrs->videoInput]);
return Dmai_EFAIL;
}
} while (strcmp(v4l2Input.name,
captureInputString[attrs->videoInput]) != 0);
// It might take a few tries to detect the signal
std = -1;
do {
ret = ioctl(fd, VIDIOC_QUERYSTD, &std);
if (ret == -1 && errno == EAGAIN) {
usleep(1);
failCount++;
}
} while (ret == -1 && errno == EAGAIN && failCount < NUM_IOCTL_RETRIES);
if (ret == -1) {
Dmai_err1("VIDIOC_QUERYSTD failed on %s. Video input connected?\n",
attrs->captureDevice);
return Dmai_EFAIL;
}
*/
std=TVP5158_STD_PAL_13;
ret = ioctl(fd, VIDIOC_S_STD, &std);
if (ret < 0) {
printf("cannot set std\n");
return -1;
}
/***********************************************************************************************/
#else
/* Select the video input */
switch (attrs->videoInput) {
case Capture_Input_SVIDEO:
input = TVP5146_AMUX_SVIDEO;
break;
case Capture_Input_COMPOSITE:
input = TVP5146_AMUX_COMPOSITE;
break;
default:
Dmai_err2("Unsupported video input (%d) on %s\n",
attrs->videoInput, attrs->captureDevice);
return Dmai_EFAIL;
}
if (ioctl(fd, VIDIOC_S_INPUT, &input) == -1) {
Dmai_err1("Failed to set video input to %d\n", input);
return Dmai_EFAIL;
}
if (ioctl(fd, VIDIOC_G_INPUT, &queryInput) == -1) {
Dmai_err0("Failed to retrieve video input setting\n");
return Dmai_EFAIL;
}
if (input != queryInput) {
Dmai_dbg2("Attempted to set video input to %d, but it still has a"
"setting of %d\n", input, queryInput);
return Dmai_EFAIL;
}
/* Auto detect PAL or NTSC using the capture driver as sanity check */
std = VPFE_STD_AUTO;
if(ioctl(fd, VIDIOC_S_STD, &std) == -1) {
Dmai_err2("VIDIOC_S_STD (auto) failed on %s (%s)\n",
attrs->captureDevice, strerror(errno));
return Dmai_EFAIL;
}
Dmai_dbg0("Checking video standard\n");
/* It might take a few tries to detect the signal */
do {
ret = ioctl(fd, VIDIOC_QUERYSTD, &std);
if (ret == -1 && errno == EAGAIN) {
usleep(1);
failCount++;
}
} while (ret == -1 && errno == EAGAIN && failCount < NUM_IOCTL_RETRIES);
if (ret == -1) {
Dmai_err1("VIDIOC_QUERYSTD failed on %s. Video input connected?\n",
attrs->captureDevice);
return Dmai_EFAIL;
}
if(ioctl(fd, VIDIOC_S_STD, &std) == -1) {
Dmai_err2("VIDIOC_S_STD failed on %s (%s)\n",
attrs->captureDevice, strerror(errno));
return Dmai_EFAIL;
}
#endif /* Dmai_Device_Dm6467 */
if (!hCapture) {

close(fd);
}

/*changed by zhangzhonghua in 2013-12-27*/
printf("zhang: std=0x%x\n",std);
/*
if (std & V4L2_STD_NTSC) {
*videoStdPtr = VideoStd_D1_NTSC;
}
else if (std & V4L2_STD_PAL) {
*videoStdPtr = VideoStd_D1_PAL;
}
else if (std & V4L2_STD_525P_60) {
*videoStdPtr = VideoStd_480P;
}
else if (std & V4L2_STD_625P_50) {
*videoStdPtr = VideoStd_576P;
}
else if (std == V4L2_STD_720P_60) {
*videoStdPtr = VideoStd_720P_60;
}
else if (std == V4L2_STD_720P_50) {
*videoStdPtr = VideoStd_720P_50;
}
else if (std == V4L2_STD_1080I_60) {
*videoStdPtr = VideoStd_1080I_30;
}
else if (std == V4L2_STD_1080I_50) {
*videoStdPtr = VideoStd_1080I_25;
}
else if (std == V4L2_STD_1080P_30) {
*videoStdPtr = VideoStd_1080P_30;
}
else if (std == V4L2_STD_1080P_25) {
*videoStdPtr = VideoStd_1080P_25;
}
else if (std == V4L2_STD_1080P_24) {
*videoStdPtr = VideoStd_1080P_24;
}
else {
Dmai_err1("Unknown video standard on capture device %s\n",
attrs->captureDevice);
return Dmai_EFAIL;
}
*/
*videoStdPtr = VideoStd_D1_PAL;
/*******************************************************************/
Dmai_dbg1("Capture input set to %s\n",
captureInputString[attrs->videoInput]);
return Dmai_EOK;
}


3:采集显示的图片

问题:采集的图像质量很差,只有隔行显示,而且每帧图像不断的往下移动?

初步判断是奇偶场图像没有合成成一个完整的帧图像。










4:超级终端打印信息

超级终端打印信息:

root@192.168.1.98:/opt/dvsdk/dvsdk# ./loadmodules.sh

ioremap_nocache(0x87800000, 69206016)=0xc8180000

allocated heap buffer 0xc8180000 of size 0x821000

cmem initialized 5 pools between 0x87800000 and 0x8ba00000

dsplinkk: no version for "struct_module" found: kernel tainted.

dsplinkk: module license 'DSP/BIOS(TM) LINK' taints kernel.

DSPLINK Module (1.50) created on Date: Jul 11 2011 Time: 16:52:18

root@192.168.1.98:/opt/dvsdk/dvsdk# ./encodedecode -r 680x576 -t 300

zhang: argsp->videoStd=5

Encodedecode demo started.

Patch is already running.

i2c_adapter i2c-0: Invalid id...

VPIF KERNEL: std_info->name TVP5158_NTSC_13

VPIF KERNEL: zhang > vpif_config_params[channel_id][index].name TVP5158_NTSC_13

, 712x2100

VPIF KERNEL: std_info->name PAL

VPIF KERNEL: zhang > vpif_config_params[channel_id][index].name PAL, 720x576

VPIF KERNEL: std_info->name PAL

VPIF KERNEL: zhang > vpif_config_params[channel_id][index].name PAL, 720x576

VPIF KERNEL: zhang > vpif_config_params[channel_id][index].name PAL, 720x576

_Attrs *attrs).

fmt.type: 2

pix.pixelformat: Y8C8

pix.height: 576

pix.width: 720

pix.field: 0

VPIF KERNEL: std_info->name PAL

VPIF KERNEL: zhang > vpif_config_params[channel_id][index].name PAL, 720x576

zhang in kernel : tvp5158_i2c_write_reg

VPIF KERNEL: std_info->name TVP5158_PAL_13

VPIF KERNEL: zhang > vpif_config_params[channel_id][index].name TVP5158_PAL_13,

712x2500

driver: vpif capture

card: DM646x EVM

bus_info: Platform

version: 1

capabilities: c000051

fmt.type: 1

pix.pixelformat: Y8C8

pix.height: 576

pix.width: 720

pix.field: 0

zhang: common->fmt.fmt.pix.sizeimage=3827200

zhang: in davincihd_capture.c

hpitch,=720,vpitch=2657, sizeimage=3827200

zhang:common->ytop_off=0,common->ytop_off=0,common->cbtm_off =1914320,common->ct

op_off=1913600

Encode Decode demo ARM Load: 40% DSP Load: 10% Display Type: D1 PAL Video Codec:

H.264 BP Video fps: 0 fps Video bit rate: 5133 kbps Video resolution: 672x576 T

ime: 00:00:01
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: