📄 fmpeg4_enc.c
字号:
#include "fmpeg4.h"
#include "../mpeg4_encoder2/encoder.h"
unsigned int fmpeg4_enc_init=0;
Encoder *fmpeg4_enc;
extern spinlock_t fmpeg4_lock;
int fmpeg4_encoder_open(struct inode *inode, struct file *filp)
{
F_DEBUG("mpeg4_encoder_open\n");
MOD_INC_USE_COUNT;
return 0; /* success */
}
int fmpeg4_encoder_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
unsigned int status;
fmpeg4_parm_t parm;
FMP4_ENC_PARAM enc_param;
FMP4_ENC_RESULT tEncResult;
F_DEBUG("fmpeg4_encoder_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));
enc_param.pu32BaseAddr = (unsigned int*)CPE_XPEG_VA_BASE;
enc_param.u32BitRate=parm.bit_rate;
enc_param.u32FrameWidth=parm.width;
enc_param.u32FrameHeight=parm.height;
enc_param.fFrameRate=(float)parm.frame_rate;
enc_param.u32InitialQuant=4;
enc_param.u32IPInterval=15;
enc_param.bShortHeader=0;
enc_param.bEnable4MV=1;
enc_param.bH263Quant=1;
enc_param.bResyncMarker=0;
enc_param.u32MaxQuant=31;
enc_param.u32MinQuant=1;
enc_param.u32Quant=16;
fmpeg4_enc=FMpeg4EncCreate(&enc_param);
if(!fmpeg4_enc)
{
F_DEBUG("FMpeg4EncCreate return fail\n");
return -EFAULT;
}
F_DEBUG("encoder create finished 0x%x\n",status);
break;
case FMPEG4_IOCTL_DECODE_DESTROY:
if(!fmpeg4_enc)
{
F_DEBUG("fail enc structure\n");
return -EFAULT;
}
FMpeg4EncDestroy(fmpeg4_enc);
fmpeg4_enc=0;
break;
case FMPEG4_IOCTL_DECODE_FRAME:
if (parm.length > BIT_STREAM_SIZE) {
F_DEBUG("encode: bitstream size over limit\n");
return -EFAULT;
}
if(!fmpeg4_enc)
{
F_DEBUG("fail enc structure\n");
return -EFAULT;
}
copy_from_user((void *)&parm, (void *)arg, sizeof(parm));
FMpeg4EncSetYUVAddr(fmpeg4_enc,(unsigned char *)parm.input_phy_y, (unsigned char *)parm.input_phy_u, (unsigned char *)parm.input_phy_v);
// to encode one frame
if(!FMpeg4EncOneFrame(fmpeg4_enc,&tEncResult)) {
F_DEBUG("FMpeg4EncOneFrame return fail\n");
return -EFAULT;
}
parm.enc_frame_type = tEncResult.u32KeyFrame;
copy_to_user((void *)__va(parm.output_phy_y),tEncResult.pu8BSptr_virt,tEncResult.u32BSlength);
copy_to_user((void *)arg,(void *)&parm,sizeof(parm));
break;
default:
break;
}
spin_unlock_irqrestore(&fmpeg4_lock, status);
return 0;
}
int fmpeg4_encoder_release(struct inode *inode, struct file *filp)
{
MOD_DEC_USE_COUNT;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -