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

📄 fmpeg4_enc.c

📁 基于Linux的ffmepg decoder
💻 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 + -