When called on a link with a filter whose destination pad has not a get_video_buffer callback defined, it will call avfilter_get_video_buffer() on the first output link of the destination filer, rather than use avfilter_default_get_buffer(), so the video buffer can be allocated forward in the filterchain. Also add the w and h parameters to avfilter_get_video_buffer(), as the minimum width and height requested by each filter in the filterchain may change, this allows for example a memcpy-less pad filter. This change breaks API / ABI backward compatibility. See the thread: "[PATCH] Implement recusive avfilter_get_video_buffer()". Originally committed as revision 20272 to svn://svn.ffmpeg.org/ffmpeg/trunk
Showing the changes to libavfilter/avfilter.c (1 of 3 files). Show all
Unified · Split
| @@ -185,17 +185,20 @@ static void dprintf_link(void *ctx, AVFilterLink *link, int end) · 184 unmodified lines | ||
| 185 | 185 | |
| 186 | 186 | #define DPRINTF_START(ctx, func) dprintf(NULL, "%-16s: ", #func) |
| 187 | 187 | |
| 188 | −AVFilterPicRef *avfilter_get_video_buffer(AVFilterLink *link, int perms) | |
| 188 | +AVFilterPicRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h) | |
| 189 | 189 | { |
| 190 | 190 | AVFilterPicRef *ret = NULL; |
| 191 | 191 | |
| 192 | − DPRINTF_START(NULL, get_video_buffer); dprintf_link(NULL, link, 0); dprintf(NULL, " perms:%d\n", perms); | |
| 192 | + DPRINTF_START(NULL, get_video_buffer); dprintf_link(NULL, link, 0); dprintf(NULL, " perms:%d w:%d h:%d\n", perms, w, h); | |
| 193 | 193 | |
| 194 | 194 | if(link_dpad(link).get_video_buffer) |
| 195 | − ret = link_dpad(link).get_video_buffer(link, perms); | |
| 195 | + ret = link_dpad(link).get_video_buffer(link, perms, w, h); | |
| 196 | + | |
| 197 | + if(!ret && link->dst->output_count) | |
| 198 | + ret = avfilter_get_video_buffer(link->dst->outputs[0], perms, w, h); | |
| 196 | 199 | |
| 197 | 200 | if(!ret) |
| 198 | − ret = avfilter_default_get_video_buffer(link, perms); | |
| 201 | + ret = avfilter_default_get_video_buffer(link, perms, w, h); | |
| 199 | 202 | |
| 200 | 203 | DPRINTF_START(NULL, get_video_buffer); dprintf_link(NULL, link, 0); dprintf(NULL, " returning "); dprintf_picref(NULL, ret, 1); |
| 201 | 204 | |
| @@ -251,7 +254,7 @@ void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref) · 49 unmodified lines | ||
| 251 | 254 | link_dpad(link).min_perms, link_dpad(link).rej_perms); |
| 252 | 255 | */ |
| 253 | 256 | |
| 254 | − link->cur_pic = avfilter_default_get_video_buffer(link, dst->min_perms); | |
| 257 | + link->cur_pic = avfilter_default_get_video_buffer(link, dst->min_perms, link->w, link->h); | |
| 255 | 258 | link->srcpic = picref; |
| 256 | 259 | link->cur_pic->pts = link->srcpic->pts; |
| 257 | 260 | link->cur_pic->pixel_aspect = link->srcpic->pixel_aspect; |