#include "common.h"
static int hello(int argc, char **argv, IOFile *files)
{
if (argc < 4)
{
printf("usage: %s output_file input_file filter_index\n"
"Filter index:.\n"
"1. Color component\n"
"2. Blur\n"
"3. Horizonal flip\n"
"4. HUE\n"
"5. Crop\n"
"6. Box\n"
"7. Text\n"
"\n", argv[0]);
return -1;
}
files->inputName = argv[1];
files->outputName = argv[2];
files->frameWidth = atoi(argv[3]);
files->frameHeight = atoi(argv[4]);
files->filterIdx = atoi(argv[5]);
files->iFile=fopen(files->inputName, "rb+");
if (!files->iFile)
{
printf("Error: open input file failed.\n");
return -1;
}
files->oFile=fopen(files->outputName, "wb+");
if (!files->oFile)
{
printf("Error: open output file failed.\n");
return -1;
}
return 0;
}
/*根据索引设置Filter描述符*/
static void setFilterDescr(int idx, char **filter_descr)
{
switch ( idx )
{
case 1 :
*filter_descr = "lutyuv='u=128:v=128'";
break;
case 2 :
*filter_descr = "boxblur";
break;
case 3 :
*filter_descr = "hflip";
break;
case 4 :
*filter_descr = "hue='h=60:s=-3'";
break;
case 5 :
*filter_descr = "crop=2/3*in_w:2/3*in_h";
break;
case 6 :
*filter_descr = "drawbox=x=100:y=100:w=100:h=100:color=pink@0.5";
break;
case 7 :
*filter_descr = "drawtext=fontfile=arial.ttf:fontcolor=green:fontsize=30:text='FFMpeg Filter Demo'";
break;
default:
printf("Error:The input index is error ,do it again.\n");
exit(1);
break;
}
}
int main(int argc, char **argv)
{
int ret = 0;
int frame_idx=1;
AVFrame *frame_in = NULL;
AVFrame *frame_out = NULL;
unsigned char *frame_buffer_in = NULL;
unsigned char *frame_buffer_out = NULL;
char *filter_descr = NULL;
IOFile files = {NULL};
/*命令行解析*/
if ( hello(argc, argv, &files) )
{
goto FF_END;
}
int frameWidth = files.frameWidth;
int frameHeight = files.frameHeight;
/*设置Filter的内容*/
setFilterDescr(files.filterIdx, &filter_descr);
/*filter注册*/
avfilter_register_all( );
/*初始化Filter相关结构,基本上主要工作都在此处*/
if(ret = Init_video_filter(filter_descr, frameWidth, frameHeight))
{
goto FF_END;
}
/*分配输入和输出frame和其存储空间*/
Init_video_frame_in_out(&frame_in,&frame_out &frame_buffer_in, &frame_buffer_out, frameWidth,frameHeight);
while (Read_yuv_data_to_buf(frame_buffer_in,&files,&frame_in))
{
/*将输入frame添加到filter graph*/
if (!Add_frame_to_filter(frame_in))
{
printf("Error while adding frame.\n");
goto FF_END;
}
/*从filter graph 中获取输出frame*/
if (!Get_frame_from_filter(&frame_out))
{
printf("Error while getting frame.\n");
goto FF_END;
}
/*将输出frame写出到输出文件*/
Write_yuv_to_outfile(frame_out, &files);
printf("Process %d frame!\n",frame_idx++);
av_frame_unref(frame_out);
}
FF_END:
/*关闭文件及相关结构*/
fclose(files.iFile);
fclose(files.oFILE);
av_frame_free(&frame_in);
av_frame_free(&frame_out);
Close_video_filter();
return 0;
}