X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fvf_tile.c;h=52d53ebcc1d727459a6cc512a58b5be317e94edc;hb=c9fe864472a2c55c7c4189ff6fb490bec8bd92b3;hp=031757a1209e02106704e4453e38a78d89cda03b;hpb=fbc5e0fae12a72b547e6d841e80116ce5c26fbf0;p=ffmpeg diff --git a/libavfilter/vf_tile.c b/libavfilter/vf_tile.c index 031757a1209..52d53ebcc1d 100644 --- a/libavfilter/vf_tile.c +++ b/libavfilter/vf_tile.c @@ -26,6 +26,9 @@ #include "libavutil/pixdesc.h" #include "avfilter.h" #include "drawutils.h" +#include "formats.h" +#include "video.h" +#include "internal.h" typedef struct { unsigned w, h; @@ -36,7 +39,7 @@ typedef struct { #define REASONABLE_SIZE 1024 -static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) +static av_cold int init(AVFilterContext *ctx, const char *args) { TileContext *tile = ctx->priv; int r; @@ -57,7 +60,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) static int query_formats(AVFilterContext *ctx) { - avfilter_set_common_pixel_formats(ctx, ff_draw_supported_pixel_formats(0)); + ff_set_common_formats(ctx, ff_draw_supported_pixel_formats(0)); return 0; } @@ -80,6 +83,8 @@ static int config_props(AVFilterLink *outlink) outlink->w = tile->w * inlink->w; outlink->h = tile->h * inlink->h; outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; + outlink->frame_rate = av_mul_q(inlink->frame_rate, + (AVRational){ 1, tile->w * tile->h }); ff_draw_init(&tile->draw, inlink->format, 0); /* TODO make the color an option, or find an unified way of choosing it */ ff_draw_color(&tile->draw, &tile->blank, (uint8_t[]){ 0, 0, 0, -1 }); @@ -91,23 +96,23 @@ static int config_props(AVFilterLink *outlink) * buffers are fed to start_frame in the order they were obtained from * get_buffer (think B-frames). */ -static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) +static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) { AVFilterContext *ctx = inlink->dst; TileContext *tile = ctx->priv; AVFilterLink *outlink = ctx->outputs[0]; if (tile->current) - return; - outlink->out_buf = avfilter_get_video_buffer(outlink, AV_PERM_WRITE, + return 0; + outlink->out_buf = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h); avfilter_copy_buffer_ref_props(outlink->out_buf, picref); outlink->out_buf->video->w = outlink->w; outlink->out_buf->video->h = outlink->h; - avfilter_start_frame(outlink, outlink->out_buf); + return 0; } -static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) +static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { AVFilterContext *ctx = inlink->dst; TileContext *tile = ctx->priv; @@ -121,18 +126,18 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) x0, y0 + y, 0, y, inlink->cur_buf->video->w, h); /* TODO if tile->w == 1 && slice_dir is always 1, we could draw_slice * immediately. */ + return 0; } -static void draw_blank_frame(AVFilterContext *ctx) +static void draw_blank_frame(AVFilterContext *ctx, AVFilterBufferRef *out_buf) { TileContext *tile = ctx->priv; AVFilterLink *inlink = ctx->inputs[0]; - AVFilterLink *outlink = ctx->outputs[0]; unsigned x0 = inlink->w * (tile->current % tile->w); unsigned y0 = inlink->h * (tile->current / tile->w); ff_fill_rectangle(&tile->draw, &tile->blank, - outlink->out_buf->data, outlink->out_buf->linesize, + out_buf->data, out_buf->linesize, x0, y0, inlink->w, inlink->h); tile->current++; } @@ -140,22 +145,26 @@ static void end_last_frame(AVFilterContext *ctx) { TileContext *tile = ctx->priv; AVFilterLink *outlink = ctx->outputs[0]; + AVFilterBufferRef *out_buf = outlink->out_buf; + outlink->out_buf = NULL; + ff_start_frame(outlink, out_buf); while (tile->current < tile->w * tile->h) - draw_blank_frame(ctx); - avfilter_draw_slice(outlink, 0, outlink->out_buf->video->h, 1); - avfilter_end_frame(outlink); + draw_blank_frame(ctx, out_buf); + ff_draw_slice(outlink, 0, out_buf->video->h, 1); + ff_end_frame(outlink); tile->current = 0; } -static void end_frame(AVFilterLink *inlink) +static int end_frame(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; TileContext *tile = ctx->priv; - avfilter_unref_buffer(inlink->cur_buf); + avfilter_unref_bufferp(&inlink->cur_buf); if (++tile->current == tile->w * tile->h) end_last_frame(ctx); + return 0; } static int request_frame(AVFilterLink *outlink) @@ -166,7 +175,7 @@ static int request_frame(AVFilterLink *outlink) int r; while (1) { - r = avfilter_request_frame(inlink); + r = ff_request_frame(inlink); if (r < 0) { if (r == AVERROR_EOF && tile->current) end_last_frame(ctx);