• 大小: 7KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-28
  • 语言: 其他
  • 标签: imx  vpu  解码  

资源简介

从飞思卡尔官方例程mxc_vpu_test中,艰难的分离出来的vpu解码部分C代码,已封装为类,关键处都有注释。使用简单,参考我的博客。

资源截图

代码片段和文件信息

#include “vpudecode.h“

VpuDecode::VpuDecode()
{
    dec = NULL;
    stream_buf = NULL;
    stream_size = 0;
    dec_buf = NULL;
    dec_size = 0;
}

VpuDecode::~VpuDecode()
{

}

int VpuDecode::poll(void)
{
    DecHandle handle = dec->Handle;
    RetCode ret;
    int loop_id;

    int is_waited_int = 0;

    memset(&par.decparam0sizeof(DecParam));

    par.decparam.dispReorderBuf = 0;
    par.decparam.skipframeMode = 0; //跳帧模式关
    par.decparam.skipframeNum = 0;
    par.decparam.iframeSearchEnable = 0;    //I帧搜索关闭

    ret = vpu_DecStartOneframe(handle &par.decparam);  //解码一帧
    if (ret == RETCODE_JPEG_EOS)    //最后一帧
    {
        printf(“ JPEG bitstream is end\n“);
        return -1;
    }
    else if (ret == RETCODE_JPEG_BIT_EMPTY) //图片位空
    {
        printf(“ RETCODE_JPEG_BIT_EMPTY\n“);
        return -1;
    }

    if (ret != RETCODE_SUCCESS)
    {
        printf(“DecStartOneframe failed ret=%d\n“ ret);
        return -1;
    }

    is_waited_int = 0;
    loop_id = 0;
    while (vpu_IsBusy())    //等待解码完成
    {

        if (loop_id == 50)
        {
            vpu_SWReset(handle 0);
            return -1;
        }

        if (vpu_WaitForInt(100) == 0)
            is_waited_int = 1;
        loop_id ++;
    }

    if (!is_waited_int)
        vpu_WaitForInt(100);

    ret = vpu_DecGetOutputInfo(handle &par.outinfo);   //读取解码信息


//    usleep(0);  //让出线程时间片

    if (ret != RETCODE_SUCCESS) {
        printf(“vpu_DecGetOutputInfo failed Err code is %d\n“
            “\tframe_id = %d\n“ ret (int)par.frame_id);
        return -1;
    }

    if (par.outinfo.decodingSuccess == 0)
    {
        printf(“Incomplete finish of decoding process.\n“
            “\tframe_id = %d\n“ (int)par.frame_id);

        return -1;
    }

    if (par.outinfo.decodingSuccess & 0x10)
    {
        printf(“vpu needs more bitstream in rollback mode\n“
            “\tframe_id = %d\n“ (int)par.frame_id);
        return 0;
    }

    if (par.outinfo.notSufficientPsBuffer) {
        printf(“PS Buffer overflow\n“);
        return -1;
    }

    if (par.outinfo.notSufficientSliceBuffer) {
        printf(“Slice Buffer overflow\n“);
        return -1;
    }

    if(par.outinfo.indexframeDecoded >= 0)
    {
        //是解码图片时出现的许多错误宏块大概101帧出现一次,原因未知
        if (par.outinfo.numOfErrMBs) {
            par.totalNumofErrMbs += par.outinfo.numOfErrMBs;
            printf(“Num of Error Mbs : %d in frame : %d \n“
                    par.outinfo.numOfErrMBs par.frame_id);
        }

        par.frame_id++; //帧计数

        dec_width = par.outinfo.decPicWidth;
        dec_height = par.outinfo.decPicHeight;
        isIDR = par.outinfo.idrFlg;
        int index = par.outinfo.indexframeDecoded;
        dec_buf = (u8 *)(dec->pfbpool[index]->addrY +
                         dec->pfbpool[index]->desc.virt_uaddr -
                         dec->pfbpool[index]->desc.p

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      19532  2020-10-25 17:50  vpudecode.cpp

     文件       4697  2020-10-25 17:49  vpudecode.h

----------- ---------  ---------- -----  ----

                24229                    2


评论

共有 条评论