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

📄 fmpeg4_avcodec.c

📁 基于Linux的ffmepg decoder
💻 C
字号:
/* fmpeg4_avcodec.c
   It is sample code for ffmpeg application usage, to define AVCodec structure.
   Note it's not a part of fmpeg driver, but collect int the same folder
 */
#include "../../../libavcodec/avcodec.h"
#include <stdio.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h> 
#include "fmpeg4_avcodec.h"

#define FMPEG4_DECODER_DEV  "/dev/fmpeg4_decoder"
#define FMPEG4_ENCODER_DEV  "/dev/fmpeg4_encoder"

int fmpeg4_dec_fd=0;
int fmpeg4_enc_fd=0;

int xvid_decoder_init(AVCodecContext *avctx)
{
    int             err;
    fmpeg4_parm_t   param;
    
    avctx->pix_fmt= PIX_FMT_RGB555;
	avctx->flags |= CODEC_FLAG_PICT_ALLOC_EXTERNAL;

printf("xvid_decode init\n");	
    if(fmpeg4_dec_fd==0)
	    fmpeg4_dec_fd=open(FMPEG4_DECODER_DEV,O_RDWR);
	    
	if(fmpeg4_dec_fd==0)
	{
	    printf("Fail to open %s\n",FMPEG4_DECODER_DEV);
	    return -1;
	}

   	param.width = avctx->width;
   	param.height = avctx->height;
    param.fb_rgb_stride = avctx->framebuffer_rgb_stride;
    param.fb_rgb_height = avctx->framebuffer_rgb_height;
    
    err=ioctl(fmpeg4_dec_fd,FMPEG4_IOCTL_DECODE_INIT,&param);
    if(err<0)
    {
	    printf("Error to set FMPEG4_IOCTL_DECODE_INIT\n");
	    return -1;
    }
	return 0;
}

int xvid_decoder_end(AVCodecContext *avctx)
{
    if(fmpeg4_dec_fd)
        close(fmpeg4_dec_fd);
    fmpeg4_dec_fd=0;
    return 0;
}

int xvid_decode(AVCodecContext *avctx, void *data, int *got_picture, uint8_t *buf, int buf_size)
{
    int             err;
    AVFrame         *picture=(AVFrame *)data;
    fmpeg4_parm_t   parm;
    
printf("xvid_decode buf=0x%x size=0x%x\n",(unsigned int)buf,(unsigned int)buf_size);
    parm.input_phy_y=(unsigned int)buf;               //input bit stream (RGB)
    parm.output_phy_y=(unsigned int)picture->data_phy[0];   //output phy address (RGB)
    parm.length=buf_size;
    
    err=ioctl(fmpeg4_dec_fd,FMPEG4_IOCTL_DECODE_FRAME,&parm);
    *got_picture=parm.got_picture;
    return parm.length;
}


AVCodec fmpeg4_decoder = {
    "fmpeg4",
    CODEC_TYPE_VIDEO,
    CODEC_ID_MPEG4,
	0,
    xvid_decoder_init,
    NULL,					/// encode
    xvid_decoder_end,		/// close
    xvid_decode,			/// decode
    0						/// capabilities
};

/******************************************************************************
    Faraday MPEG4 encoder
 *****************************************************************************/
typedef struct FmpegEncContext {
	void * pEnc;
	AVFrame picture;
	int frame_count;
} FmpegEncContext;


int enc_init(AVCodecContext *avctx)
{
    fmpeg4_parm_t   parm;
    int             err;

    if(fmpeg4_enc_fd==0)
	    fmpeg4_enc_fd=open(FMPEG4_ENCODER_DEV,O_RDWR);
	if(fmpeg4_enc_fd==0)
	{
	    printf("Fail to open %s\n",FMPEG4_ENCODER_DEV);
	    return -1;
	}

    parm.bit_rate=avctx->bit_rate;
    parm.width=avctx->width;
    parm.height=avctx->height;
    parm.frame_rate=(float)avctx->frame_rate/(float)avctx->frame_rate_base;
    
    err=ioctl(fmpeg4_enc_fd,FMPEG4_IOCTL_ENCODE_INIT,&parm);
    if(err<0)
    {
	    printf("Error to set FMPEG4_IOCTL_INIT\n");
	    return -1;
    }
    
    avctx->coded_frame= avcodec_alloc_frame();
    avctx->coded_frame->key_frame=1;
	return 0;
}

int enc_close(AVCodecContext *avctx)
{
    if(fmpeg4_enc_fd)
        close(fmpeg4_enc_fd);
    fmpeg4_enc_fd=0;
    av_freep(&avctx->coded_frame);
	return 0;
}

int xvid_encode(AVCodecContext *avctx, unsigned char *frame, int buf_size, void * data)
{
    AVFrame         *pict=(AVFrame *)data;
    fmpeg4_parm_t   parm;
    int             err;
    
    parm.input_phy_y=(unsigned int)pict->data_phy[0];   //input phy address (Y)
    parm.input_phy_u=(unsigned int)pict->data_phy[0];   //input phy address (U)
    parm.input_phy_v=(unsigned int)pict->data_phy[0];   //input phy address (V)
    parm.output_phy_y=(unsigned int)frame;                  //output bit stream (RGB)
    
    parm.length=buf_size;	
	err=ioctl(fmpeg4_enc_fd,FMPEG4_IOCTL_ENCODE_FRAME,&parm);
    if(err<0)
    {
	    printf("Error to set FMPEG4_IOCTL_ENCODE_FRAME\n");
	    return -1;
    }
    
    pict->key_frame = parm.enc_frame_type;
    return 0;
}


AVCodec fmpeg4_encoder = {
    "mpeg4",
    CODEC_TYPE_VIDEO,
    CODEC_ID_MPEG4,
    0,
    enc_init,
    xvid_encode,
    enc_close,					/// close
    NULL,					/// decode
	0
};

⌨️ 快捷键说明

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