TI论坛
直播中

李锰

7年用户 181经验值
私信 关注
[问答]

DM368 420_to_420_resize解码出现条纹

你好 专家 我出现以下问题不知道怎么了?
我是做了解码后的resize 解码后是420的   所以是420_to_420的resize  我是把1920x1080  缩小的   不知道为什么会出现这样条纹
我的代码是这样的
Void *displayThrFxn(Void *arg)
[
   Resize_Attrs            rszAttrs       = Resize_Attrs_DEFAULT;
   DisplayEnv             *envp       = (DisplayEnv *) arg;
   Display_Attrs           dAttrs     = Display_Attrs_DM365_VID_DEFAULT;
   Display_Handle          hDisplay   = NULL;
   Framecopy_Handle        hFc        = NULL;
   Void                   *status     = THREAD_SUCCESS;
   Uns                     frameCnt   = 0;
   BufferGfx_Dimensions    srcDim,dim;
   Buffer_Handle           hSrcBuf, hDstBuf;
   Resize_Handle           hRsz           = NULL;
   Int                     fifoRet;
   ColorSpace_Type         colorSpace = ColorSpace_YUV420PSEMI;
   BufferGfx_Attrs         gfxAttrs = BufferGfx_Attrs_DEFAULT;
   BufTab_Handle           hBufTab  = NULL;
   Int32                   bufSize;
   time_Attrs              tAttrs   = Time_Attrs_DEFAULT;
   Time_Handle             hTime    = NULL;
   Int32                   time, waitTime;
   Int                     bufCnt = 1;
   BufTab_Handle           hDisplayBufTab;
   hTime = Time_create(&tAttrs);
   Int                     bufIdx;
   if (hTime == NULL) [
       ERR("Failed to create Time objectn");
       cleanup(THREAD_FAILURE);
   ]
/* Create the resize job */
   hRsz = Resize_create(&rszAttrs);
   if (hRsz == NULL) [
     ///  ret = Dmai_EFAIL;
      ERR("Failed to create resize jobn");
      cleanup(THREAD_FAILURE);
   ]
   if(Time_reset(hTime) != Dmai_EOK) [
       ERR("Failed to reset timern");
       cleanup(THREAD_FAILURE);
   ]
           if (bufCnt == 1) [  // Create the Display at the first frame
               gfxAttrs.dim.width =960;
               gfxAttrs.dim.height =540+17;
               gfxAttrs.dim.lineLength =Dmai_roundUp(BufferGfx_calcLineLength(gfxAttrs.dim.width,
                                      colorSpace), 32)+64;
               printf("jjjj=%dn",gfxAttrs.dim.lineLength);
               gfxAttrs.dim.x =4;// srcDim.x;
               gfxAttrs.dim.y =-2;// srcDim.y;
               if (colorSpace ==  ColorSpace_YUV420PSEMI) [
                   bufSize = gfxAttrs.dim.lineLength * gfxAttrs.dim.height *
                       3 / 2;
               ] else [
                   bufSize = gfxAttrs.dim.lineLength * gfxAttrs.dim.height * 2;
               ]
               /* Create a table of buffers to use with the device drivers */
               gfxAttrs.colorSpace = colorSpace;
               hBufTab = BufTab_create(NUM_DISPLAY_BUFS, bufSize,
                   BufferGfx_getBufferAttrs(&gfxAttrs));
               if (hBufTab == NULL) [
                   ERR("Failed to create buftabn");
                   cleanup(THREAD_FAILURE);
               ]
               /* Create the display device instance */
               dAttrs.delayStreamon = TRUE;
               dAttrs.numBufs = NUM_DISPLAY_BUFS;
               dAttrs.videoStd = envp->videoStd;
               /*
                * Round down the width to a multiple of 32 as required by
                * display driver. Otherwise, the driver would internally round
                * up the width, resulting in the codec padding showing up
                * on the display when the image width is not a multiple of 32.
                */
               dAttrs.width = ((gfxAttrs.dim.width & 0x1f) ?
                   (gfxAttrs.dim.width & ~(0x1f)) : gfxAttrs.dim.width);
               dAttrs.height = gfxAttrs.dim.height;
               dAttrs.videoOutput = envp->displayOutput;
               dAttrs.colorSpace  = colorSpace;
               hDisplay = Display_create(hBufTab, &dAttrs);
               if (hDisplay == NULL) [
                   ERR("Failed to create display devicen");
                   cleanup(THREAD_FAILURE);
               ]
            hDisplayBufTab = Display_getBufTab(hDisplay);
       for (bufIdx = 0; bufIdx < BufTab_getNumBufs(hDisplayBufTab); bufIdx++)
         [
               hDstBuf = BufTab_getBuf(hDisplayBufTab, bufIdx);
               BufferGfx_getDimensions(hDstBuf, &dim);
              dim.width   =gfxAttrs.dim.width;
              dim.height  =gfxAttrs.dim.height;
              dim.x       = gfxAttrs.dim.x;
              dim.y       = gfxAttrs.dim.y;
            //  dim.lineLength=gfxAttrs.dim.lineLength;
           if (BufferGfx_setDimensions(hDstBuf, &dim) < 0)
               [
               //ret = Dmai_EFAIL;
               fprintf(stderr,"Output resolution does not fit in display framen");
              // goto cleanup;
               ]
          if (Display_put(hDisplay, hDstBuf) < 0)
            [
              ERR("Failed to put display buffern");
             cleanup(THREAD_FAILURE);
           ]
]
           ]
           bufCnt++;
   /* Signal that initialization is done and wait for other threads */
   Rendezvous_meet(envp->hRendezvousInit);
   while (!gblGetQuit()) [
       /* Pause processing? */
       Pause_test(envp->hPauseProcess);
       /* Pause for priming? */
       Pause_test(envp->hPausePrime);
       /* Get decoded video frame */
       fifoRet = Fifo_get(envp->hInFifo, &hSrcBuf);
       if (fifoRet < 0) [
           ERR("Failed to get buffer from video threadn");
           cleanup(THREAD_FAILURE);
       ]
       /* Did the video thread flush the fifo? */
       if (fifoRet == Dmai_EFLUSH) [
           cleanup(THREAD_SUCCESS);
       ]
//    BufferGfx_getDimensions(hSrcBuf, &srcDim);
//   printf("+%d +%d +%d +%d+%dn",srcDim.width,srcDim.height,srcDim.x,srcDim.y,srcDim.lineLength);
           /* Get a buffer from the display device driver */
           if (Display_get(hDisplay, &hDstBuf) < 0) [
               ERR("Failed to get display buffern");
               cleanup(THREAD_FAILURE);
           ]
           if (Resize_420_to_420_execute(hRsz, hSrcBuf,  hDstBuf) < 0) [////Resize_doYUV420SP/////Resize_420_to_420_execute
            ERR("Failed to execute resize jobn");
           cleanup(THREAD_FAILURE);
           ]
           /* Send buffer back to the video thread */
           if (Fifo_put(envp->hOutFifo, hSrcBuf) < 0) [
               ERR("Failed to send buffer to video threadn");
               cleanup(THREAD_FAILURE);
           ]
       if (envp->videoStd == VideoStd_720P_60) [
           if (Time_delta(hTime, (UInt32*)&time) < 0) [
               ERR("Failed to get timer deltan");
               cleanup(THREAD_FAILURE);
           ]
           waitTime = DISPLAYLOOPLATENCY - time;
           if(waitTime > 0) [
               usleep(waitTime);
           ]
           if(Time_reset(hTime) != Dmai_EOK) [
               ERR("Failed to reset timern");
               cleanup(THREAD_FAILURE);
           ]
       ]
       /* Incremement statistics for the user interface */
       gblIncFrames();           
       /* Give a filled buffer back to the display device driver */
       if (Display_put(hDisplay, hDstBuf) < 0) [
           ERR("Failed to put display buffern");
           cleanup(THREAD_FAILURE);
       ]
       frameCnt++;
   ]
cleanup:
   /* Make sure the other threads aren't waiting for us */
   Rendezvous_force(envp->hRendezvousInit);
   Pause_off(envp->hPauseProcess);
   Pause_off(envp->hPausePrime);
   Fifo_flush(envp->hOutFifo);
   /* Meet up with other threads before cleaning up */
   Rendezvous_meet(envp->hRendezvousCleanup);
   /* Clean up the thread before exiting */
   if (hFc) [
       Framecopy_delete(hFc);
   ]
   if (hDisplay) [
       Display_delete(hDisplay);
   ]
   /* Clean up the thread before exiting */
   if (hBufTab) [
       BufTab_delete(hBufTab);
   ]
   if(hTime) [
       Time_delete(hTime);
   ]
   return status;
]
执行resize代码是这样的
Int Resize_doYUV420SP(Resize_Handle hResize, Buffer_Handle hSrcBuf, Buffer_Handle hDstBuf)
[
                BufferGfx_Dimensions srcDim, dstDim;
                UInt                                 hDif;
                UInt                                 vDif;
                struct rsz_channel_config rsz_chan_config;
                struct rsz_single_shot_config rsz_ss_config;
                struct imp_convert        rsz;
                 UInt32                           ysrcOffset, csrcOffset;
                 UInt32                           ydstOffset, cdstOffset;
                 UInt32                        numBytesUsed;
                /* Make sure our input parameters are valid */
                if (!hResize) [
                        Dmai_err0("Resize_Handle parameter must not be NULLn");
                        return Dmai_EINVAL;
                ]
                if (!hSrcBuf) [
                        Dmai_err0("Source buffer parameter must not be NULLn");
                        return Dmai_EINVAL;
                ]
                if (!hDstBuf) [
                        Dmai_err0("Destination buffer parameter must not be NULLn");
                        return Dmai_EINVAL;
                ]
                /* Buffer needs to be graphics buffers */
                if (Buffer_getType(hSrcBuf) != Buffer_Type_GRAPHICS ||
                                Buffer_getType(hDstBuf) != Buffer_Type_GRAPHICS) [
                        Dmai_err0("Src and dst buffers need to be graphics buffersn");
                        return Dmai_EINVAL;
                ]
                BufferGfx_getDimensions(hSrcBuf, &srcDim);
                BufferGfx_getDimensions(hDstBuf, &dstDim);
                if (dstDim.width <= 0) [
                        Dmai_err0("Destination buffer width must be greater than zeron");
                        return Dmai_EINVAL;
                ]
                if (dstDim.height <= 0) [
                        Dmai_err0("Destination buffer height must be greater than zeron");
                        return Dmai_EINVAL;
                ]
                if ((srcDim.lineLength & 0x1F) != 0) [
                        Dmai_err0("Source buffer pitch must be a multiple of 32 bytesn");
                        return Dmai_EINVAL;
                ]
                if ((dstDim.lineLength & 0x1F) != 0) [
                        Dmai_err0("Destination buffer pitch must be a multiple of 32 bytesn");
                        return Dmai_EINVAL;
                ]
                /* Check for valid buffer scaling */
                hDif = srcDim.width  * 256 / dstDim.width;
                vDif = srcDim.height * 256 / dstDim.height;
                if (hDif < 32) [
                        Dmai_err0("Horizontal up-scaling must not exceed 8xn");
                        return Dmai_EINVAL;
                ]
                if (hDif > 4096) [
                        Dmai_err0("Horizontal down-scaling must not exceed 1/16xn");
                        return Dmai_EINVAL;
                ]
                if (vDif < 32) [
                        Dmai_err0("Vertical up-scaling must not exceed 8xn");
                        return Dmai_EINVAL;
                ]
                if (vDif > 4096) [
                        Dmai_err0("Vertical down-scaling must not exceed 1/16xn");
                        return Dmai_EINVAL;
                ]
                /* Set the driver default parameters and retrieve what was set */
                Dmai_clear(rsz_ss_config);
                rsz_chan_config.oper_mode = IMP_MODE_SINGLE_SHOT;
                rsz_chan_config.chain = 0;
                rsz_chan_config.len = 0;
                rsz_chan_config.config = NULL; /* to set defaults in driver */
                if (ioctl(hResize->fd, RSZ_S_CONFIG, &rsz_chan_config) < 0) [
                        Dmai_err0("Error in setting default configuration for single shot moden");
                        goto cleanup;
                ]
                /* default configuration setting in Resizer successfull */
                Dmai_clear(rsz_ss_config);
                rsz_chan_config.oper_mode = IMP_MODE_SINGLE_SHOT;
                rsz_chan_config.chain = 0;
                rsz_chan_config.len = sizeof(struct rsz_single_shot_config);
                rsz_chan_config.config = &rsz_ss_config;
                if (ioctl(hResize->fd, RSZ_G_CONFIG, &rsz_chan_config) < 0) [
                        Dmai_err0("Error in getting resizer channel configuration from drivern");
                        goto cleanup;
                ]
                /* input params are set at the resizer */
                rsz_ss_config.input.image_width  = srcDim.width;
                rsz_ss_config.input.image_height = srcDim.height;
                rsz_ss_config.input.ppln = rsz_ss_config.input.image_width + 8;
                rsz_ss_config.input.lpfr = rsz_ss_config.input.image_height + 10;
rsz_ss_config.input.clk_div.m = 60;//10;
        rsz_ss_config.input.clk_div.n = 70;//3;//70;//
                rsz_ss_config.input.pix_fmt = IPIPE_420SP_Y;
                rsz_ss_config.output1.pix_fmt = IPIPE_YUV420SP;
                rsz_ss_config.output1.enable = 1;
                rsz_ss_config.output1.width = dstDim.width;
                rsz_ss_config.output1.height = dstDim.height;
                rsz_ss_config.output2.enable = 0;
                rsz_chan_config.oper_mode = IMP_MODE_SINGLE_SHOT;
                rsz_chan_config.chain = 0;
                rsz_chan_config.len = sizeof(struct rsz_single_shot_config);
                if (ioctl(hResize->fd, RSZ_S_CONFIG, &rsz_chan_config) < 0) [
                        Dmai_err0("Error in setting default configuration for single shot moden");
                        goto cleanup;
                ]
                rsz_chan_config.oper_mode = IMP_MODE_SINGLE_SHOT;
                rsz_chan_config.chain = 0;
                rsz_chan_config.len = sizeof(struct rsz_single_shot_config);
                /* read again and verify */
                if (ioctl(hResize->fd, RSZ_G_CONFIG, &rsz_chan_config) < 0) [
                        Dmai_err0("Error in getting configuration from drivern");
                        goto cleanup;
                ]
/////////////////////////////////////////////////////////////////
                 Dmai_clear(rsz);
        /*        printf("srcbuf ptr: %lx, bytesused: %ld, dstbuf ptr: %lx, bytesused: %ldn",
                        (UInt32) Buffer_getUserPtr(hSrcBuf), (UInt32)Buffer_getNumBytesUsed(hSrcBuf),
                        (UInt32) Buffer_getUserPtr(hDstBuf), (UInt32)Buffer_getNumBytesUsed(hDstBuf));
                printf("srcdim linelength: %ld, x: %ld, y: %ld, w:%ld, h:%ld n",
                        srcDim.lineLength, srcDim.x, srcDim.y, srcDim.width, srcDim.height);
                printf("dstdim linelength: %ld, x: %ld, y: %ld, w:%ld, h:%ld n",
                        dstDim.lineLength, dstDim.x, dstDim.y, dstDim.width, dstDim.height);*/
//resize Y first
                 ysrcOffset = srcDim.y * srcDim.lineLength + (srcDim.x << 0); //by xiaoguang 1 -> 0
                 ydstOffset = dstDim.y * dstDim.lineLength + (dstDim.x << 0); //by xiaoguang 1 -> 0
                 rsz.in_buff.index           = -1;
                 rsz.in_buff.buf_type  = IMP_BUF_IN;
                 rsz.in_buff.offset    = (UInt32) Buffer_getUserPtr(hSrcBuf) + ysrcOffset;
                 rsz.in_buff.size           = srcDim.width * srcDim.height;
                 rsz.out_buff1.index        = -1;
                 rsz.out_buff1.buf_type = IMP_BUF_OUT1;
                 rsz.out_buff1.offset        = (UInt32) Buffer_getUserPtr(hDstBuf) + ydstOffset;
                 rsz.out_buff1.size         = dstDim.width * dstDim.height;
                 /*
                  * The IPIPE requires that the memory offsets of the input and output
                  * buffers start on 32-byte boundaries.
                  */
                  rsz.in_buff.offset = ((rsz.in_buff.offset + 31)/32)*32;
                   rsz.out_buff1.offset = ((rsz.out_buff1.offset + 31)/32)*32;
                 assert((rsz.in_buff.offset  & 0x1F) == 0);
                 assert((rsz.out_buff1.offset & 0x1F) == 0);
                 /* Start IPIPE operation */
                 if (ioctl(hResize->fd, RSZ_RESIZE, &rsz) == -1) [
                         Dmai_err0("Failed RSZ_RESIZEn");
                         return Dmai_EFAIL;
                 ]
//resize CbCr
                 /* input params are set at the resizer */
                 rsz_ss_config.input.image_width  = srcDim.width;
                 rsz_ss_config.input.image_height = srcDim.height/2;
                 rsz_ss_config.input.ppln = rsz_ss_config.input.image_width + 8;
                 rsz_ss_config.input.lpfr = rsz_ss_config.input.image_height + 10;
rsz_ss_config.input.clk_div.m = 60;//10;
        rsz_ss_config.input.clk_div.n = 70;//3;//70;//
                 rsz_ss_config.input.pix_fmt = IPIPE_420SP_C;
                 rsz_ss_config.output1.pix_fmt = IPIPE_YUV420SP;
                 rsz_ss_config.output1.enable = 1;
                 rsz_ss_config.output1.width = dstDim.width;
                 rsz_ss_config.output1.height = dstDim.height+1;
                 rsz_ss_config.output2.enable = 0;
                 rsz_chan_config.oper_mode = IMP_MODE_SINGLE_SHOT;
                 rsz_chan_config.chain = 0;
                 rsz_chan_config.len = sizeof(struct rsz_single_shot_config);
                 rsz_chan_config.config = &rsz_ss_config;
                 if (ioctl(hResize->fd, RSZ_S_CONFIG, &rsz_chan_config) < 0) [
                         Dmai_err0("Error in setting default configuration for single shot moden");
                         goto cleanup;
                 ]
                 rsz_chan_config.oper_mode = IMP_MODE_SINGLE_SHOT;
                 rsz_chan_config.chain = 0;
                 rsz_chan_config.len = sizeof(struct rsz_single_shot_config);
                 /* read again and verify */
                 if (ioctl(hResize->fd, RSZ_G_CONFIG, &rsz_chan_config) < 0) [
                         Dmai_err0("Error in getting configuration from drivern");
                         goto cleanup;
                 ]
                 csrcOffset = ysrcOffset /2;
                 cdstOffset = ydstOffset /2;
                 rsz.in_buff.offset    = (UInt32) Buffer_getUserPtr(hSrcBuf) + ysrcOffset*2 +
                                                                 srcDim.width * srcDim.height + csrcOffset;
                 rsz.in_buff.size           = srcDim.width * srcDim.height / 2;
#if 0
                 rsz.out_buff1.offset        = (UInt32) Buffer_getUserPtr(hDstBuf) + ydstOffset*2 + dstDim.width * dstDim.height + cdstOffset;
                 rsz.out_buff1.size         = dstDim.width * dstDim.height / 2;
#else
                 rsz.out_buff1.offset = (UInt32) Buffer_getUserPtr(hDstBuf) + ydstOffset*2 +((dstDim.height-1)*dstDim.width);
                 rsz.out_buff1.size = dstDim.width * (dstDim.height+1) / 2;
#endif
                  rsz.in_buff.offset = ((rsz.in_buff.offset + 31)/32)*32;
                   rsz.out_buff1.offset = ((rsz.out_buff1.offset + 31)/32)*32;
                 assert((rsz.in_buff.offset  & 0x1F) == 0);
                 assert((rsz.out_buff1.offset & 0x1F) == 0);
                 /* Start IPIPE operation */
                 if (ioctl(hResize->fd, RSZ_RESIZE, &rsz) == -1) [
                         Dmai_err0("Failed RSZ_RESIZEn");
                         return Dmai_EFAIL;
                 ]
                 numBytesUsed = (UInt32)(
                                                 ((dstDim.x << 1) + dstDim.width ) *
                                                 ((dstDim.y << 1) + dstDim.height) * 3 / 2
                                                 );
                 Buffer_setNumBytesUsed(hDstBuf, numBytesUsed);
                 return Dmai_EOK;
///////////////////////////////////////////////////////////////////
        cleanup:
                close(hResize->fd);
                hResize->fd = 0;
                return Dmai_EFAIL;
]

回帖(4)

傅利

2019-2-15 14:40:24
你好,我的QQ是1969947
交流一下!
举报

高欢

2019-2-15 14:50:10
专家个鬼,都是在TI骗吃骗喝的。
举报

赵天湖

2019-2-15 15:04:11
引用: liuqin123 发表于 2019-2-15 14:50
专家个鬼,都是在TI骗吃骗喝的。

提问题请客气些!

感觉你直接修改了DMAI的代码
看图像结果,感觉resizer的配置或者数据没有对齐

你看PSP下面有example的例子,里面有420-to-420的例子可以供参考
举报

李锰

2019-2-15 15:20:15
引用: liuqin123 发表于 2019-2-15 14:50
专家个鬼,都是在TI骗吃骗喝的。

兄弟啊  大家都是出来学习的,虚心点啦!你能不能 解决我的问题呢 !多谢啦!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分