📄 fmpeg4_avcodec.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,¶m);
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 + -