• Join
  • Sign In with my.TI Login
Texas Instruments
  • Products
  • Applications
  • Tools & Software
  • Support & Community
  • Sample & Buy
  • About TI
Sample & Purchase Cart Sample & Purchase Cart
  • Search
  • Advanced
TI E2E™ Community
  • Support Forums
  • Blogs
  • Groups
  • Videos
  • 简体中文
  • More ...
TI Home » TI E2E Community » Support Forums » Embedded Software » Multimedia Software Codecs » Multimedia Software Codecs forum » VIDDEC2_process is blocked by H.264 decoder instance on the DM368 IPNC EVM.
Share
Multimedia Software Codecs
  • Forum
Options
  • Subscribe via RSS

Forums

VIDDEC2_process is blocked by H.264 decoder instance on the DM368 IPNC EVM.

  • kwon daesung
    Posted by kwon daesung
    on Feb 13 2012 23:08 PM
    Prodigy60 points

    Hi.

    I have a problem on the DM368 IPNC EVM.

    Using DVSDK version is below.

     - DVSDK : 2_10_01_18

     - H.264 Decoder : 2.0.0.13

     

    The problem is that VIDDEC2_process() blocked at a first frame while h264 decoding.

    H264 stream well decode on the windows S/W players.

    I don't know why VIDDEC2_process()  blocked.

    can anybody help me?

     

    Test stream information.

     - H264 stream was encoded by same DM368 IPNC.

     - resolution : 640x480

     - Bit rate : 4.5Mbps

     - Frame rate : 30fps

     

    Used algorithem in the algorithm server.

     - g711enc

     -h264enc

     -h264dec

     -ktnf

     -iprun

     

    cmem structure.

     insmod cmemk.ko phys_start=0x83000000 phys_end=0x88000000 allowOverlap=1 phys_start_1=0x00001000 phys_end_1=0x00008000 pools_1=1x28672

     

    1. below is messages when CE_DEBUG=2.

    **********************************************

    @20,298,676us: [+0 T:0x47c15490] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_control> Enter (handle=0x484e50, id=1, dynParams=0x47c14d44 (size=0x28), status=0x484cd4 (size=0xb8)
    @20,298,929us: [+5 T:0x47c15490] CV - VISA_enter(visa=0x484e50): algHandle = 0x4845e0
    @20,299,050us: [+0 T:0x47c15490] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Enter(alg=0x4845e0)
    @20,299,245us: [+0 T:0x47c15490] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Exit
    @20,299,554us: [+5 T:0x47c15490] CV - VISA_exit(visa=0x484e50): algHandle = 0x4845e0
    @20,299,669us: [+0 T:0x47c15490] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Enter(alg=0x4845e0)
    @20,299,807us: [+0 T:0x47c15490] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Exit
    @20,299,918us: [+0 T:0x47c15490] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_control> Exit (handle=0x484e50, retVal=0x0)
    @20,300,030us: [+0 T:0x47c15490] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_control> Enter (handle=0x484e50, id=5, dynParams=0x484da8 (size=0x1c), status=0x484cd4 (size=0xb8)
    @20,300,156us: [+5 T:0x47c15490] CV - VISA_enter(visa=0x484e50): algHandle = 0x4845e0
    @20,300,254us: [+0 T:0x47c15490] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Enter(alg=0x4845e0)
    @20,300,380us: [+0 T:0x47c15490] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Exit
    @20,300,499us: [+5 T:0x47c15490] CV - VISA_exit(visa=0x484e50): algHandle = 0x4845e0
    @20,300,602us: [+0 T:0x47c15490] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Enter(alg=0x4845e0)
    @20,300,733us: [+0 T:0x47c15490] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Exit
    @20,300,840us: [+0 T:0x47c15490] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_control> Exit (handle=0x484e50, retVal=0x0)
     ALG: VidDec: XDM_GETBUFINFO: min out bufs:2,size:871424 435712
    VIDDEC2_process() enter
    @20,301,062us: [+0 T:0x47c15490] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_process> Enter (handle=0x484e50, inBufs=0x47c14c80, outBufs=0x47c14d80, inArgs=0x47c14d8c, outArgs=0x47c144e0)
    @20,301,199us: [+5 T:0x47c15490] CV - VISA_enter(visa=0x484e50): algHandle = 0x4845e0
    @20,301,297us: [+0 T:0x47c15490] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Enter(alg=0x4845e0)
    @20,301,423us: [+0 T:0x47c15490] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Exit

    -- No more message.   decoding thread is blocked .

    ====================================================================== 


     

    2. My source code.

    **********************************************

    /*  algorithem open  */

    ALG_VidDecCreate  createPrm;

    ALG_VidDecRunPrm  runPrm;
     ALG_VidDecRunStatus  runStatus;

     whOffset   = 96;
     maxWidth   = 640;
     maxHeight  = 480;
     algVidDecHndl = NULL;

     ibufVirtAddr = OSA_cmemAlloc(0x00200000, 32); // 2MB
     ibufPhysAddr = OSA_cmemGetPhysAddr(ibufVirtAddr);
     if( ibufVirtAddr == NULL || ibufPhysAddr == NULL ) goto error_proc;

     for( i=0; i<NUMOF_OUTBUF; i++ )
     {
         obufVirtAddr[i] = OSA_cmemAlloc(0x00400000, 32); // 4MB
         obufPhysAddr[i] = OSA_cmemGetPhysAddr(obufVirtAddr[i]);
         if( obufVirtAddr[i] == NULL ||  obufPhysAddr[i] == NULL )
             goto error_proc;
     }

     createPrm.codec  = ALG_VID_CODEC_H264;
     createPrm.dataFormat = DRV_DATA_FORMAT_YUV420;
     createPrm.maxWidth = maxWidth;
     createPrm.maxHeight = maxHeight;

     algVidDecHndl = ALG_vidDecCreate(&createPrm);
     if( algVidDecHndl==NULL )
     {
        IVNET_error("ALG_vidDecCreate() failed!\n");
        goto error_proc;
     }

    //  -------------

    /* run decoding */

    // after read one frame stream from a file.

    runPrm.inAddr         = ibufVirtAddr;
    runPrm.outAddr        = obufVirtAddr[0] + VIDEO_BUF_HEADER_SIZE;
    runPrm.inDataSize     = streamSize;
    runPrm.outOffsetH     = OSA_align( 640+ whOffset, 32);
    runPrm.outOffsetV     = 480 + whOffset;
    runPrm.inputBufId     = 0;

        status = ALG_vidDecRun(gAviPlayerParm.algVidDecHndl, &gAviPlayerParm.runPrm, &gAviPlayerParm.runStatus);

     

    void *ALG_vidDecCreate(ALG_VidDecCreate *create)
    {
      ALG_VidDecObj *pObj;

      pObj = OSA_memAlloc(sizeof(*pObj));

      if(pObj==NULL)
        return NULL;

      memset(pObj, 0, sizeof(*pObj));

      memcpy(&pObj->createPrm, create, sizeof(pObj->createPrm));

      switch(create->codec)
      {
        case ALG_VID_CODEC_H264:
          strcpy(pObj->algName, ALG_VID_CODEC_H264_DEC_NAME);
          break;
        case ALG_VID_CODEC_MPEG4:
          strcpy(pObj->algName, ALG_VID_CODEC_MPEG4_DEC_NAME);
          break;
        case ALG_VID_CODEC_MJPEG:
        {
          ALG_JpgDecCreate jpgDecCreate;

          jpgDecCreate.dataFormat = create->dataFormat;
          jpgDecCreate.maxWidth = create->maxWidth;
          jpgDecCreate.maxHeight = create->maxHeight;

          pObj->hJpgDecode = ALG_jpgDecCreate(&jpgDecCreate);

          if(pObj->hJpgDecode==NULL)
            return NULL;

          return pObj;
        }
          break;
        default:
          OSA_memFree(pObj);
          return NULL;
      }

      memcpy(&pObj->h264Params, &IH264VDEC_PARAMS, sizeof(pObj->h264Params));

      pObj->params.size               = sizeof(VIDDEC2_Params);
      pObj->params.maxHeight          = 480;
      pObj->params.maxWidth           = 640;
      pObj->params.maxFrameRate       = 0;
      pObj->params.maxBitRate    = 0x800000; // 8 Mbit
      pObj->params.dataEndianness     = XDM_BYTE;
      pObj->params.forceChromaFormat  = XDM_YUV_420SP;
     

     pObj->h264Params.displayDelay    = 0;
     pObj->h264Params.levelLimit     = 0;
     pObj->h264Params.hdvicpHandle    = (void*) NULL;
     pObj->h264Params.disableHDVICPeveryFrame = 0;
     pObj->h264Params.frame_closedloop_flag  = 1; //reduce memory use of decoder
     pObj->h264Params.inputDataMode    = 1; // 0: Processing of one slice, 1: Processing of entire frame data
     pObj->h264Params.sliceFormat    = 1; // 0: Output data in NAL stream format, 1: Output data in BYTE stream format


     pObj->h264Params.viddecParams    = pObj->params;
     pObj->h264Params.viddecParams.size   = sizeof(IH264VDEC_Params); /*sizeof(pObj->h264Params);*/

      /* Create video decoder instance */
     pObj->hDecode = VIDDEC2_create(gALG_hEngine, pObj->algName, (VIDDEC2_Params*)(&pObj->h264Params));
      if (pObj->hDecode == NULL) {
        OSA_ERROR("Failed to open video decode algorithm (%s)\n", pObj->algName);
        OSA_memFree(pObj);
        return NULL;
      }

      return (void*)pObj;
    }

    int ALG_vidDecRun(void *hndl, ALG_VidDecRunPrm *prm, ALG_VidDecRunStatus *runStatus)
    {
      VIDDEC2_InArgs  inArgs;
      VIDDEC2_OutArgs outArgs;
      XDM1_BufDesc    inBufDesc;
      XDM_BufDesc     outBufDesc;
      XDAS_Int32      outBufSizeArray[2];
      XDAS_Int32      status;
      XDAS_Int8      *outBufPtrs[2];
      ALG_VidDecObj   *pObj;
      IH264VDEC_DynamicParams h264DynParams;

      pObj = (ALG_VidDecObj *)hndl;

      if(pObj==NULL)
        return OSA_EFAIL;

      if(pObj->createPrm.codec == ALG_VID_CODEC_MJPEG) {

        ALG_JpgDecRunPrm jpgDecRun;
        ALG_JpgDecRunStatus jpgDecStatus;

        jpgDecRun.inAddr = prm->inAddr;
        jpgDecRun.inDataSize = prm->inDataSize;
        jpgDecRun.outAddr = prm->outAddr;
        jpgDecRun.outOffsetH = prm->outOffsetH;
        jpgDecRun.outOffsetV = prm->outOffsetV;
        jpgDecRun.outStartX = 0;
        jpgDecRun.outStartY = 0;

        status = ALG_jpgDecRun(pObj->hJpgDecode, &jpgDecRun, &jpgDecStatus);
        if(status!=OSA_SOK)
          return OSA_EFAIL;

        runStatus->bytesUsed  = jpgDecStatus.bytesUsed;
        runStatus->isKeyFrame = TRUE;
        runStatus->frameWidth = jpgDecStatus.frameWidth;
        runStatus->frameHeight= jpgDecStatus.frameHeight;
        runStatus->outputBufId= prm->inputBufId;
        runStatus->freeBufId  = prm->inputBufId;
        runStatus->outStartX  = jpgDecRun.outStartX;
        runStatus->outStartY  = jpgDecRun.outStartY;
        runStatus->outOffsetH = jpgDecRun.outOffsetH;
        runStatus->outOffsetV = jpgDecRun.outOffsetV;

        return OSA_SOK;
      }

      if(pObj->hDecode==NULL)
        return OSA_EFAIL;

      if(pObj->curFrameNum==0)
      {
        pObj->dynamicParams.size          = sizeof(VIDDEC2_DynamicParams);
        pObj->dynamicParams.decodeHeader  = XDM_DECODE_AU;
        pObj->dynamicParams.displayWidth  = prm->outOffsetH;
        pObj->dynamicParams.frameSkipMode = IVIDEO_NO_SKIP;
     pObj->dynamicParams.frameOrder    = IVIDDEC2_DECODE_ORDER;

        pObj->decStatus.size     = sizeof(VIDDEC2_Status);
        pObj->decStatus.data.buf = NULL;

        h264DynParams.viddecDynamicParams = pObj->dynamicParams;
        h264DynParams.viddecDynamicParams.size = sizeof(h264DynParams);
        h264DynParams.resetHDVICPeveryFrame = 1;
        h264DynParams.dataSyncHandle = NULL;
        h264DynParams.getDataFxn = NULL;    

     status = VIDDEC2_control(pObj->hDecode, XDM_SETPARAMS, (VIDDEC2_DynamicParams*)(&h264DynParams), &pObj->decStatus); // KDS 2012.2.2 M
        if (status != VIDDEC2_EOK) {
          OSA_ERROR("XDM_SETPARAMS failed, status=%ld\n", status);
          return OSA_EFAIL;
        }

        /* Get buffer information from video decoder */
        pObj->decStatus.size     = sizeof(VIDDEC2_Status);
        pObj->decStatus.data.buf = NULL;

        pObj->dynamicParams.size = sizeof(VIDDEC2_DynamicParams);
        status = VIDDEC2_control(pObj->hDecode, XDM_GETBUFINFO, &pObj->dynamicParams, &pObj->decStatus);
        if (status != VIDDEC2_EOK) {
          OSA_ERROR("XDM_GETBUFINFO failed, status=%ld\n", status);
          return OSA_EFAIL;
        }

     #if 1
        OSA_printf(" ALG: VidDec: XDM_GETBUFINFO: min out bufs:%ld,size:%ld %ld\n",pObj->decStatus.bufInfo.minNumOutBufs,pObj->decStatus.bufInfo.minOutBufSize[0], pObj->decStatus.bufInfo.minOutBufSize[1]);
        #endif
      }

      pObj->dynamicParams.size      = sizeof(VIDDEC2_DynamicParams);


      pObj->decStatus.size          = sizeof(VIDDEC2_Status);
      pObj->decStatus.data.buf      = NULL;

      outBufSizeArray[0] = (prm->outOffsetH)*(prm->outOffsetV);
      outBufSizeArray[1] = outBufSizeArray[0]/2;

      inBufDesc.descs[0].bufSize = prm->inDataSize; // same as frame size.
      inBufDesc.descs[0].buf  = (XDAS_Int8 *)prm->inAddr;
      inBufDesc.numBufs       = 1;

      outBufPtrs[0] = (XDAS_Int8 *)prm->outAddr;
      outBufPtrs[1] = (XDAS_Int8 *)(prm->outAddr + outBufSizeArray[0]) ;

      outBufDesc.bufSizes     = outBufSizeArray;
      outBufDesc.bufs         = (XDAS_Int8 **) &outBufPtrs;
      outBufDesc.numBufs      = 2;

      inArgs.size             = sizeof(VIDDEC2_InArgs);
      inArgs.numBytes         = prm->inDataSize;
      inArgs.inputID          = prm->inputBufId+1; // must be greater than 0

      outArgs.size            = sizeof(VIDDEC2_OutArgs);
      outArgs.outBufsInUseFlag=0; 
      status = VIDDEC2_process(pObj->hDecode, &inBufDesc, &outBufDesc, &inArgs, &outArgs);

      status = VIDDEC2_control(pObj->hDecode, XDM_GETSTATUS, &pObj->dynamicParams, &pObj->decStatus);
      if (status != VIDDEC2_EOK) {
        OSA_ERROR("XDM_GETSTATUS failed, status=%ld\n", status);
        return OSA_EFAIL;
      }
      runStatus->bytesUsed = outArgs.bytesConsumed;

      switch (outArgs.displayBufs[0].frameType) {
        case IVIDEO_I_FRAME:
          runStatus->isKeyFrame = TRUE;
          break;
        case IVIDEO_P_FRAME:
          runStatus->isKeyFrame = FALSE;
          break;
        case IVIDEO_B_FRAME:
          runStatus->isKeyFrame = FALSE;
          break;
        case IVIDEO_IDR_FRAME:
          runStatus->isKeyFrame = TRUE;
          break;
        case IVIDEO_II_FRAME:
          runStatus->isKeyFrame = TRUE;
          break; 
        case IVIDEO_PP_FRAME:
          runStatus->isKeyFrame = FALSE;
          break;     
        default: 
          runStatus->isKeyFrame = FALSE;
          break;
      }

      runStatus->frameWidth = pObj->decStatus.outputWidth;
      runStatus->frameHeight = pObj->decStatus.outputHeight;

     if(outArgs.outBufsInUseFlag == 1)
     {
       inBufDesc.descs[0].buf  = (XDAS_Int8 *)prm->inAddr + runStatus->bytesUsed;
       status = VIDDEC2_process(pObj->hDecode, &inBufDesc, &outBufDesc, &inArgs, &outArgs);

       runStatus->bytesUsed += outArgs.bytesConsumed;
       if (status != VIDDEC2_EOK) {
      OSA_ERROR("status=%ld\n", status);
     //    return OSA_EFAIL;
       }

      VIDDEC2_control(pObj->hDecode, XDM_GETSTATUS, &pObj->dynamicParams, &pObj->decStatus);
       if (status != VIDDEC2_EOK) {
      OSA_ERROR("XDM_GETSTATUS failed with error code = 0x%x , status=%ld\n", (unsigned int)pObj->decStatus.extendedError,status);
     //    OSA_fileWriteFile("InputBitstream.dat", (XDAS_Int8 *)prm->inAddr, prm->inDataSize);
      OSA_printf("\r\n Bytes Consumed so far = %d ",(int)runStatus->bytesUsed);
      return OSA_EFAIL;
       }
     }
      if(outArgs.displayBufs[0].bufDesc[0].buf == NULL) {
        return OSA_EFAIL;
      }
      else {
        runStatus->outputBufId = outArgs.outputID[0]-1; // to adjust for +1 done in inputID
        runStatus->freeBufId = outArgs.freeBufID[0]-1;
        if(pObj->curFrameNum==0) {
          pObj->outStartY = ((Uint32)outArgs.displayBufs[0].bufDesc[0].buf - (Uint32)prm->outAddr)/prm->outOffsetH;
          pObj->outStartX = ((Uint32)outArgs.displayBufs[0].bufDesc[0].buf - (Uint32)prm->outAddr)%prm->outOffsetH;
        }
        runStatus->outStartX = pObj->outStartX;
        runStatus->outStartY = pObj->outStartY;
        runStatus->outOffsetH= prm->outOffsetH;
        runStatus->outOffsetV= prm->outOffsetV;
      }

      pObj->curFrameNum++;

      return OSA_SOK;
    }

     

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • Yashwant Dutt
    Posted by Yashwant Dutt
    on Feb 15 2012 06:39 AM
    Genius15110 points

    Can you just run with H.264 encoder and decoder (remove ktnf) and try.

    regards

    Yashwant

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • kwon daesung
    Posted by kwon daesung
    on Feb 21 2012 19:34 PM
    Prodigy60 points

    Very very thanks your reply.

    I tried h264 decoding without KTNF.

    But, problem is still.

    Do you have another idea?

    I'm in despair gradualy.  (T.T)

     

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • Raghu Kudva
    Posted by Raghu Kudva
    on Mar 29 2012 03:18 AM
    Expert6665 points

    Are you still facing this issue?

    Can you give more logs? is the issue with DMA channels?

    Regards,

    Raghu


    Please mark this reply as Verify Answer on this post if it answers the question.

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • kwon daesung
    Posted by kwon daesung
    on Mar 29 2012 03:47 AM
    Prodigy60 points

    This problem is still.

    I don't know that this issue is related QDMA.

    Will some logs to help the problem?

    Thanks and regards.

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
TI E2E™ Community
  • Support Forums
  • Blogs
  • Videos
  • Groups
  • Site Support & Feedback
  • Settings
TI E2E™ Community Groups
  • TI University Program
  • Make the Switch
  • Microcontroller Projects
  • Motor Drive & Control
Other Communities
  • Deyisupport
  • Designsomething.org
  • beagleboard.org
  • TI on Element 14
  • TI on TechXchangeSM
Other Technical & Support Resources
  • WEBENCH® Design Center
  • Product Information Centers
  • Technical Documents
  • TI Design Network
  • TI Technical Articles
  • TI Training

All content and materials on this site are provided "as is". TI and its respective suppliers and providers of content make no representations about the suitability of these materials for any purpose and disclaim all warranties and conditions with regard to these materials, including but not limited to all implied warranties and conditions of merchantability, fitness for a particular purpose, title and non-infringement of any third party intellectual property right. TI and its respective suppliers and providers of content make no representations about the suitability of these materials for any purpose and disclaim all warranties and conditions with respect to these materials. No license, either express or implied, by estoppel or otherwise, is granted by TI. Use of the information on this site may require a license from a third party, or a license from TI.

Content on this site may contain or be subject to specific guidelines or limitations on use. All postings and use of the content on this site are subject to the Terms of Use of the site; third parties using this content agree to abide by any limitations or guidelines and to comply with the Terms of Use of this site. TI, its suppliers and providers of content reserve the right to make corrections, deletions, modifications, enhancements, improvements and other changes to the content and materials, its products, programs and services at any time or to move or discontinue any content, products, programs, or services without notice.

Follow Us Texas Instruments on Facebook Texas Instruments on Twitter Texas Instruments on LinkedIn Texas Instruments on Google+
TI Worldwide | Contact Us | my.TI Login | Site Map | Corporate Citizenship | mobile m.ti.com (Mobile Version)

TI is a global semiconductor design and manufacturing company. Innovate with 100,000+ analog ICs and
embedded processors, along with software, tools and the industry’s largest sales/support staff.

© Copyright 1995-2013 Texas Instruments Incorporated. All rights reserved.
Trademarks | Privacy Policy | Terms of Use