|
|
|
@@ -20,6 +20,7 @@ |
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
|
|
*/ |
|
|
|
|
|
|
|
#include "libavutil/avassert.h" |
|
|
|
#include "libavutil/imgutils.h" |
|
|
|
|
|
|
|
#include "avfilter.h" |
|
|
|
@@ -223,6 +224,7 @@ static void clear_link(AVFilterLink *link) |
|
|
|
avfilter_unref_bufferp(&link->cur_buf); |
|
|
|
avfilter_unref_bufferp(&link->src_buf); |
|
|
|
avfilter_unref_bufferp(&link->out_buf); |
|
|
|
link->cur_buf_copy = NULL; /* we do not own the reference */ |
|
|
|
} |
|
|
|
|
|
|
|
/* XXX: should we do the duplicating of the picture ref here, instead of |
|
|
|
@@ -265,6 +267,8 @@ int ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref) |
|
|
|
else |
|
|
|
link->cur_buf = picref; |
|
|
|
|
|
|
|
link->cur_buf_copy = link->cur_buf; |
|
|
|
|
|
|
|
while(cmd && cmd->time <= picref->pts * av_q2d(link->time_base)){ |
|
|
|
av_log(link->dst, AV_LOG_DEBUG, |
|
|
|
"Processing command time:%f command:%s arg:%s\n", |
|
|
|
@@ -278,6 +282,10 @@ int ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref) |
|
|
|
ff_update_link_current_pts(link, pts); |
|
|
|
if (ret < 0) |
|
|
|
clear_link(link); |
|
|
|
else |
|
|
|
/* incoming buffers must not be freed in start frame, |
|
|
|
because they can still be in use by the automatic copy mechanism */ |
|
|
|
av_assert1(link->cur_buf_copy->buf->refcount > 0); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
@@ -348,22 +356,22 @@ int ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) |
|
|
|
if (link->src_buf->data[i]) { |
|
|
|
src[i] = link->src_buf-> data[i] + |
|
|
|
(y >> (i==1 || i==2 ? vsub : 0)) * link->src_buf-> linesize[i]; |
|
|
|
dst[i] = link->cur_buf->data[i] + |
|
|
|
(y >> (i==1 || i==2 ? vsub : 0)) * link->cur_buf->linesize[i]; |
|
|
|
dst[i] = link->cur_buf_copy->data[i] + |
|
|
|
(y >> (i==1 || i==2 ? vsub : 0)) * link->cur_buf_copy->linesize[i]; |
|
|
|
} else |
|
|
|
src[i] = dst[i] = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
for (i = 0; i < 4; i++) { |
|
|
|
int planew = |
|
|
|
av_image_get_linesize(link->format, link->cur_buf->video->w, i); |
|
|
|
av_image_get_linesize(link->format, link->cur_buf_copy->video->w, i); |
|
|
|
|
|
|
|
if (!src[i]) continue; |
|
|
|
|
|
|
|
for (j = 0; j < h >> (i==1 || i==2 ? vsub : 0); j++) { |
|
|
|
memcpy(dst[i], src[i], planew); |
|
|
|
src[i] += link->src_buf->linesize[i]; |
|
|
|
dst[i] += link->cur_buf->linesize[i]; |
|
|
|
dst[i] += link->cur_buf_copy->linesize[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@@ -373,6 +381,10 @@ int ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) |
|
|
|
ret = draw_slice(link, y, h, slice_dir); |
|
|
|
if (ret < 0) |
|
|
|
clear_link(link); |
|
|
|
else |
|
|
|
/* incoming buffers must not be freed in start frame, |
|
|
|
because they can still be in use by the automatic copy mechanism */ |
|
|
|
av_assert1(link->cur_buf_copy->buf->refcount > 0); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
|