資源簡介
從飛思卡爾官方例程mxc_vpu_test中,艱難的分離出來的vpu解碼部分C代碼,已封裝為類,關(guān)鍵處都有注釋。使用簡單,參考我的博客。

代碼片段和文件信息
#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;?//跳幀模式關(guān)
????par.decparam.skipframeNum?=?0;
????par.decparam.iframeSearchEnable?=?0;????//I幀搜索關(guān)閉
????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);??//讓出線程時(shí)間片
????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)
????{
????????//是解碼圖片時(shí)出現(xiàn)的許多錯(cuò)誤宏塊大概101幀出現(xiàn)一次,原因未知
????????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++;?//幀計(jì)數(shù)
????????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
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件??????19532??2020-10-25?17:50??vpudecode.cpp
?????文件???????4697??2020-10-25?17:49??vpudecode.h
-----------?---------??----------?-----??----
????????????????24229????????????????????2
評論
共有 條評論