⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp4vdec.c

📁 基于Linux的ffmepg decoder
💻 C
字号:
#define MP4VDEC_GLOBALS#include "../fmpeg4_driver/fmpeg4.h"#include "portab.h"#include "mp4vdec.h"#include "decoder.h"//#include "utils/mem_transfer.h"#include "mp4.h"#include "bitstream/bitstream.h"#include "local_mem.h"#include "me.h"int32_tMp4VDec_Init(FMP4_DEC_PARAM * ptParam, void ** pptDecHandle){	return decoder_create(ptParam, pptDecHandle);}uint32_tMp4VDec_QueryEmptyBuffer (void * ptDecHandle){	DECODER * dec = (DECODER *)ptDecHandle;	return dec->u32BS_buf_sz - dec->u32BS_buf_sz_remain;}uint32_tMp4VDec_QueryFilledBuffer (void * ptDecHandle){	DECODER * dec = (DECODER *)ptDecHandle;	return dec->u32BS_buf_sz_remain;}int32_tMp4VDec_FillBuffer(void * ptDecHandle, uint8_t * ptBuf, uint32_t u32BufSize){	DECODER * dec = (DECODER *)ptDecHandle;	if (dec->pfnSemWait) dec->pfnSemWait (dec->pvSemaphore);	if (u32BufSize > (dec->u32BS_buf_sz - dec->u32BS_buf_sz_remain))		return FARADAY_ERR_FAIL;	if ((dec->u32BS_buf_sz_remain) && (dec->pu8BS_start_virt != dec->pu8BS_ptr_virt))		memcpy(dec->pu8BS_start_virt, dec->pu8BS_ptr_virt, dec->u32BS_buf_sz_remain);	if (u32BufSize)		memcpy(dec->pu8BS_start_virt + dec->u32BS_buf_sz_remain, ptBuf, u32BufSize);	dec->pu8BS_ptr_virt = dec->pu8BS_start_virt;	dec->pu8BS_ptr_phy = dec->pu8BS_start_phy;	dec->u32BS_buf_sz_remain += u32BufSize;	if (dec->pfnSemSignal) dec->pfnSemSignal(dec->pvSemaphore);	return FARADAY_ERR_OK;}voidMp4VDec_InvalidBS (void * ptDecHandle){	DECODER * dec = (DECODER *)ptDecHandle;	if (dec->pfnSemWait) dec->pfnSemWait (dec->pvSemaphore);	dec->pu8BS_ptr_virt = dec->pu8BS_start_virt;	dec->pu8BS_ptr_phy = dec->pu8BS_start_phy;	dec->u32BS_buf_sz_remain = 0;	if (dec->pfnSemSignal) dec->pfnSemSignal(dec->pvSemaphore);}voidMp4VDec_EndOfData (void * ptDecHandle){	DECODER * dec = (DECODER *)ptDecHandle;	dec->bBS_end_of_data = TRUE;}voidMp4VDec_SetOutputAddr (void * ptDecHandle,		uint8_t * pu8output_phy, uint8_t * pu8output_u_phy, uint8_t * pu8output_v_phy){	DECODER * dec = (DECODER *)ptDecHandle;	dec->output_base_phy = pu8output_phy;#if (OUTPUT_FMT == OUTPUT_FMT_YUV)	dec->output_base_u_phy = pu8output_u_phy;	dec->output_base_u_phy = pu8output_v_phy;#endif}int32_tMp4VDec_OneFrame(void * ptDecHandle, FMP4_DEC_RESULT * ptResult){	 return decoder_decode(ptDecHandle, ptResult);}voidMp4VDec_Release(void * ptDecHandle){	decoder_destroy(ptDecHandle);}// init decoder (except first run) for every different bitstreamvoidMp4VDec_Reinit(void * ptDecHandle){	DECODER * dec = (DECODER *)ptDecHandle;	dec->bBS_end_of_data = FALSE;	// for auto setting	dec->width = 0;	dec->height = 0;	dec->output_stride = 0;	dec->output_height = 0;	dec->data_partitioned=0;	dec->h263 = 0;	dec->reversible_vlc = 0;	dec->interlacing = 0;	dec->time_inc_bits = 0;	dec->low_delay = 0;	dec->frames = -1;	dec->time = dec->time_base = dec->last_time_base = 0;}voidMp4VDec_AssignBS_VPE(void * ptDecHandle, uint8_t * ptBuf, uint32_t u32BufSize){	DECODER * dec = (DECODER *)ptDecHandle;	dec->pu8BS_ptr_virt = dec->pu8BS_start_virt =	dec->pu8BS_ptr_phy = dec->pu8BS_start_virt = ptBuf;	dec->u32BS_buf_sz_remain = u32BufSize;}voidMp4VDec_Add_BS_VPE(void * ptDecHandle, uint32_t u32BufSize){	DECODER * dec = (DECODER *)ptDecHandle;	dec->u32BS_buf_sz_remain += u32BufSize;}uint8_t *Mp4VDec_Got_BS_ptrv_VPE(void * ptDecHandle){	return (((DECODER *)ptDecHandle)->pu8BS_ptr_virt);}voidMp4VDec_AssignRefBase_VPE(void * ptDecHandle,				uint8_t * y_phy, uint8_t * u_phy, uint8_t * v_phy){	DECODER * dec = (DECODER *)ptDecHandle;	dec->refn.y_phy = y_phy;	dec->refn.u_phy = u_phy;	dec->refn.v_phy = v_phy;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -