seed-dvs6467 encodedecode實例 採集的圖像質量很差,只有隔行顯示,而且每幀圖像不斷的往下移動?

問題:採集的圖像質量很差,只有隔行顯示,而且每幀圖像不斷的往下移動?

初步判斷是奇偶場圖像沒有合成成一個完整的幀圖像。本人嘗試設置成奇偶場的格式(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:超級終端打印信息

 

超級終端打印信息:

[email protected]:/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
[email protected]:/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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章