|
|
|
@ -80,6 +80,7 @@ typedef struct { |
|
|
|
|
struct FFBufQueue queue_top; |
|
|
|
|
struct FFBufQueue queue_bottom; |
|
|
|
|
int hsub, vsub; ///< chroma subsampling values
|
|
|
|
|
int nb_planes; |
|
|
|
|
int frame_requested; |
|
|
|
|
char *all_expr; |
|
|
|
|
enum BlendMode all_mode; |
|
|
|
@ -330,6 +331,7 @@ static int config_input_top(AVFilterLink *inlink) |
|
|
|
|
|
|
|
|
|
b->hsub = pix_desc->log2_chroma_w; |
|
|
|
|
b->vsub = pix_desc->log2_chroma_h; |
|
|
|
|
b->nb_planes = av_pix_fmt_count_planes(inlink->format); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -371,7 +373,7 @@ static void blend_frame(AVFilterContext *ctx, |
|
|
|
|
FilterParams *param; |
|
|
|
|
int plane; |
|
|
|
|
|
|
|
|
|
for (plane = 0; dst_buf->data[plane]; plane++) { |
|
|
|
|
for (plane = 0; plane < b->nb_planes; plane++) { |
|
|
|
|
int hsub = plane == 1 || plane == 2 ? b->hsub : 0; |
|
|
|
|
int vsub = plane == 1 || plane == 2 ? b->vsub : 0; |
|
|
|
|
int outw = dst_buf->width >> hsub; |
|
|
|
@ -422,7 +424,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf) |
|
|
|
|
|
|
|
|
|
b->frame_requested = 0; |
|
|
|
|
blend_frame(ctx, top_buf, bottom_buf, out_buf); |
|
|
|
|
ret = ff_filter_frame(ctx->outputs[0], out_buf); |
|
|
|
|
ret = ff_filter_frame(outlink, out_buf); |
|
|
|
|
av_frame_free(&top_buf); |
|
|
|
|
av_frame_free(&bottom_buf); |
|
|
|
|
} |
|
|
|
|