?? fmpeg4_dec.c
字號:
#include "fmpeg4.h"
#include "../mpeg4_decoder2/decoder.h"
/**********************************/
/* Faraday mpeg4 decoder driver */
/**********************************/
static void *dec_handle=NULL;
DECODER *fmpeg4_dec;
unsigned int fmpeg4_dec_init=0;
extern spinlock_t fmpeg4_lock;
int fmpeg4_decoder_open(struct inode *inode, struct file *filp)
{
F_DEBUG("mpeg4_decoder_open\n");
MOD_INC_USE_COUNT;
return 0; /* success */
}
int fmpeg4_decoder_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
unsigned int status;
fmpeg4_parm_t parm;
FMP4_DEC_RESULT tDecResult;
FMP4_DEC_PARAM tDecParam;
F_DEBUG("fmpeg4_decoder_ioctl:cmd=0x%x\n",cmd);
spin_lock_irqsave(&fmpeg4_lock, status);
switch(cmd)
{
case FMPEG4_IOCTL_DECODE_INIT:
copy_from_user((void *)&parm, (void *)arg, sizeof(parm));
tDecParam.u32API_version = 0x00020002;
tDecParam.pu32BaseAddr = (unsigned int*)CPE_XPEG_VA_BASE;
tDecParam.pu8FrameBaseAddr_phy = 0;
tDecParam.pfnSemWait = 0;
tDecParam.pfnSemSignal= 0;
tDecParam.pvSemaphore = 0;
tDecParam.u32FrameWidth = parm.fb_rgb_stride;
tDecParam.u32FrameHeight = parm.fb_rgb_height;
tDecParam.u32MaxWidth = parm.width;
tDecParam.u32MaxHeight = parm.height;
tDecParam.u32BSBufSize = BIT_STREAM_SIZE;
tDecParam.u32CacheAlign = 16;
tDecParam.pfnDmaMalloc = 0; //we don't need it
tDecParam.pfnDmaFree = 0; //we don't need it
if (Mp4VDec_Init(&tDecParam,(void **)&fmpeg4_dec)!= FARADAY_ERR_OK){
F_DEBUG("Mp4VDec_Init decoder failure\n");
return -EFAULT;
}
fmpeg4_dec_init=1;
F_DEBUG("decoder create finished 0x%x\n",status);
break;
case FMPEG4_IOCTL_DECODE_DESTROY:
if(fmpeg4_dec)
decoder_destroy(fmpeg4_dec);
fmpeg4_dec=0;
break;
case FMPEG4_IOCTL_DECODE_FRAME:
if (parm.length > BIT_STREAM_SIZE) {
F_DEBUG("xvid_decode: bitstream size over limit\n");
return -EFAULT;
}
if(dec_handle==0)
{
F_DEBUG("xvid_decode: NULL dec_handle\n");
return -EFAULT;
}
copy_from_user((void *)&parm, (void *)arg, sizeof(parm));
if (Mp4VDec_FillBuffer(fmpeg4_dec,(unsigned char *)parm.input_phy_y, parm.length) == FARADAY_ERR_FAIL)
{
F_DEBUG("ERROR in FillBuffer\n");
return -EFAULT;
}
Mp4VDec_SetOutputAddr(fmpeg4_dec, (unsigned char *)parm.output_phy_y, 0, 0);
if(Mp4VDec_OneFrame(fmpeg4_dec, &tDecResult) == FARADAY_ERR_FAIL)
{
parm.got_picture=0;
}
else
{
parm.got_picture=1;
}
copy_to_user((void *)arg,(void *)&parm,sizeof(parm));
break;
default:
break;
}
spin_unlock_irqrestore(&fmpeg4_lock, status);
return 0;
}
int fmpeg4_decoder_release(struct inode *inode, struct file *filp)
{
MOD_DEC_USE_COUNT;
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -