Community
cancel
Showing results for 
Search instead for 
Did you mean: 
dong_x_
Beginner
93 Views

the CPU occupancy rate

 

HI

    I have a problem,it seem impossible.

    this is my function.  but the CPU occupancy rate is same as soft decode,sometimes higher. 

    The other parts are same, just one use soft decode, the other use mfx . the frame rate is same. the decode image is right.

   Is the function bellow wrong? 

    

BOOL CIntelDecode::DecodeInputData(BYTE *pData , int size)
    {
        //decodeData
        mfxStatus sts = MFX_ERR_NONE;
        mfxSyncPoint syncp;
        mfxFrameSurface1* pmfxOutSurface;

        mfxBitstream mfxBS;
        memset(&mfxBS, 0, sizeof(mfxBS));
        mfxBS.Data = (mfxU8 *)pData;
        mfxBS.MaxLength = size;
        mfxBS.DataLength = size;
        mfxBS.DataOffset = 0;

        while (MFX_ERR_NONE <= sts || MFX_ERR_MORE_DATA == sts || MFX_ERR_MORE_SURFACE == sts)
        {

            if (MFX_WRN_DEVICE_BUSY == sts)
            {
                MSDK_SLEEP(1);  // Wait if device is busy, then repeat the same call to DecodeFrameAsync
            }

            if (MFX_ERR_MORE_DATA == sts) 
            {            
                break;        
                // Read more data into input bit stream
                //MSDK_BREAK_ON_ERROR(sts);
            }

            if (MFX_ERR_MORE_SURFACE == sts || MFX_ERR_NONE == sts) 
            {
                _currentSurfaceIndex = GetFreeSurfaceIndex(_pmfxSurfaces, _numSurfaces);        // Find free frame surface
                if(MFX_ERR_NOT_FOUND == _currentSurfaceIndex)
                {
                    break;
                }
                //MSDK_CHECK_ERROR(MFX_ERR_NOT_FOUND, nIndex, MFX_ERR_MEMORY_ALLOC);
            }

            // Decode a frame asychronously (returns immediately)
            //  - If input bitstream contains multiple frames DecodeFrameAsync will start decoding multiple frames, and remove them from bitstream

            sts = _mfxDEC->DecodeFrameAsync(&mfxBS, _pmfxSurfaces[_currentSurfaceIndex], &pmfxOutSurface, &syncp);

            // Ignore warnings if output is available,
            // if no output and no action required just repeat the DecodeFrameAsync call
            if (MFX_ERR_NONE < sts && syncp)
            {
                sts = MFX_ERR_NONE;
            }

            if (MFX_ERR_NONE == sts)
            {
                sts = _mfxSession.SyncOperation(syncp, 60000);      // Synchronize. Wait until decoded frame is ready
            }

            if (MFX_ERR_NONE == sts) 
            {
                //ConvertToRGB(pmfxOutSurface);
            }
        }

        return TRUE;
    }

0 Kudos
3 Replies
93 Views

Hello Dong,

Thanks for the question. Looking at your code, it looks very similar to our simple_2_decode_vmem tutorial code - which does give considerable performance benefit for HW impl versus SW.

Can you please let me know:

- what system you are working on (processor/gfx, OS, MSS version installed) -> If you are on Windows, please send the output of sys_analyzer you will find in the tools/ folder in the install path.

- if you are accounting for file i/o as well (output of YUV raw frames, as you know, can considerably affect the overall fps),

- if you can reproduce the issue using simple_2_decode_vmem and send the output please?

(Apologies for the delayed response).

dong_x_
Beginner
93 Views

Hi SRAVANTHI K

    thanks a lot!

    that is my problem. Change SW to  HW, the CPU usage is down.

 

93 Views

Glad it is resolved Dong. Happy coding!

Reply