|
|
|
@ -339,34 +339,6 @@ static struct termios oldtty; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if CONFIG_AVFILTER |
|
|
|
|
typedef struct { |
|
|
|
|
int pix_fmt; |
|
|
|
|
} FilterOutPriv; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int output_init(AVFilterContext *ctx, const char *args, void *opaque) |
|
|
|
|
{ |
|
|
|
|
FilterOutPriv *priv = ctx->priv; |
|
|
|
|
|
|
|
|
|
if(!opaque) return -1; |
|
|
|
|
|
|
|
|
|
priv->pix_fmt = *((int *)opaque); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void output_end_frame(AVFilterLink *link) |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int output_query_formats(AVFilterContext *ctx) |
|
|
|
|
{ |
|
|
|
|
FilterOutPriv *priv = ctx->priv; |
|
|
|
|
enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE }; |
|
|
|
|
|
|
|
|
|
avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts)); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int get_filtered_video_pic(AVFilterContext *ctx, |
|
|
|
|
AVFilterBufferRef **picref, AVFrame *pic2, |
|
|
|
@ -391,29 +363,13 @@ static int get_filtered_video_pic(AVFilterContext *ctx, |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static AVFilter output_filter = |
|
|
|
|
{ |
|
|
|
|
.name = "ffmpeg_output", |
|
|
|
|
|
|
|
|
|
.priv_size = sizeof(FilterOutPriv), |
|
|
|
|
.init = output_init, |
|
|
|
|
|
|
|
|
|
.query_formats = output_query_formats, |
|
|
|
|
|
|
|
|
|
.inputs = (AVFilterPad[]) {{ .name = "default", |
|
|
|
|
.type = AVMEDIA_TYPE_VIDEO, |
|
|
|
|
.end_frame = output_end_frame, |
|
|
|
|
.min_perms = AV_PERM_READ, }, |
|
|
|
|
{ .name = NULL }}, |
|
|
|
|
.outputs = (AVFilterPad[]) {{ .name = NULL }}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static int configure_filters(AVInputStream *ist, AVOutputStream *ost) |
|
|
|
|
{ |
|
|
|
|
AVFilterContext *last_filter, *filter; |
|
|
|
|
/** filter graph containing all filters including input & output */ |
|
|
|
|
AVCodecContext *codec = ost->st->codec; |
|
|
|
|
AVCodecContext *icodec = ist->st->codec; |
|
|
|
|
FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt }; |
|
|
|
|
char args[255]; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
@ -421,7 +377,7 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost) |
|
|
|
|
|
|
|
|
|
if ((ret = avfilter_open(&ist->input_video_filter, avfilter_get_by_name("buffer"), "src")) < 0) |
|
|
|
|
return ret; |
|
|
|
|
if ((ret = avfilter_open(&ist->output_video_filter, &output_filter, "out")) < 0) |
|
|
|
|
if ((ret = avfilter_open(&ist->output_video_filter, &ffsink, "out")) < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width, |
|
|
|
@ -429,7 +385,7 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost) |
|
|
|
|
ist->st->time_base.num, ist->st->time_base.den); |
|
|
|
|
if ((ret = avfilter_init_filter(ist->input_video_filter, args, NULL)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
if ((ret = avfilter_init_filter(ist->output_video_filter, NULL, &codec->pix_fmt)) < 0) |
|
|
|
|
if ((ret = avfilter_init_filter(ist->output_video_filter, NULL, &ffsink_ctx)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
/* add input and output filters to the overall graph */ |
|
|
|
|