diff options
author | Vitor Sessak <vitor1001@gmail.com> | 2008-02-15 21:40:30 +0000 |
---|---|---|
committer | Vitor Sessak <vitor1001@gmail.com> | 2008-02-15 21:40:30 +0000 |
commit | 35db407eb26425ea3bc10a25b031dee0f45a5cf5 (patch) | |
tree | 805ff9a24bc7691db0c94257271d0bfa73dd5576 | |
parent | 7b02c484eb4e5b1b10fa060c42932e303d58e392 (diff) | |
download | ffmpeg-35db407eb26425ea3bc10a25b031dee0f45a5cf5.tar.gz |
The filter framework as is hangs with filters that
modify the input buffer, even if it asks for the right
permission. This is a fix for that.
See "Box blurring with libavfilter" thread in libav-user.
Commited in SoC by Vitor Sessak on 2008-02-09 11:03:35
Originally committed as revision 12040 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavfilter/avfilter.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index f2a42cbd50..e1a439bb2f 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -213,10 +213,12 @@ void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref) /* prepare to copy the picture if it has insufficient permissions */ if((link_dpad(link).min_perms & picref->perms) != link_dpad(link).min_perms || link_dpad(link).rej_perms & picref->perms) { + /* av_log(link->dst, AV_LOG_INFO, "frame copy needed (have perms %x, need %x, reject %x)\n", picref->perms, link_dpad(link).min_perms, link_dpad(link).rej_perms); + */ link->cur_pic = avfilter_default_get_video_buffer(link, link_dpad(link).min_perms); link->srcpic = picref; @@ -231,6 +233,11 @@ void avfilter_end_frame(AVFilterLink *link) { void (*end_frame)(AVFilterLink *); + if(!(end_frame = link_dpad(link).end_frame)) + end_frame = avfilter_default_end_frame; + + end_frame(link); + /* unreference the source picture if we're feeding the destination filter * a copied version dues to permission issues */ if(link->srcpic) { @@ -238,10 +245,6 @@ void avfilter_end_frame(AVFilterLink *link) link->srcpic = NULL; } - if(!(end_frame = link_dpad(link).end_frame)) - end_frame = avfilter_default_end_frame; - - end_frame(link); } void avfilter_draw_slice(AVFilterLink *link, int y, int h) @@ -253,6 +256,7 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h) if(link->srcpic) { avcodec_get_chroma_sub_sample(link->format, &hsub, &vsub); + link->cur_pic->pts = link->srcpic->pts; src[0] = link->srcpic-> data[0] + y * link->srcpic-> linesize[0]; dst[0] = link->cur_pic->data[0] + y * link->cur_pic->linesize[0]; for(i = 1; i < 4; i ++) { |