On Fri, May 17, 2013 at 8:50 AM, Anton Khirnov <[email protected]> wrote:
> ---
> libavfilter/vf_fade.c | 81
> ++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 57 insertions(+), 24 deletions(-)
>
> diff --git a/libavfilter/vf_fade.c b/libavfilter/vf_fade.c
> index 9f3a602..8e6c2fa 100644
> --- a/libavfilter/vf_fade.c
> +++ b/libavfilter/vf_fade.c
> @@ -92,39 +92,71 @@ static int config_props(AVFilterLink *inlink)
> return 0;
> }
>
> -static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
> +static int filter_slice_luma(AVFilterContext *ctx, void *arg, int jobnr,
> + int nb_jobs)
> {
> - FadeContext *s = inlink->dst->priv;
> - uint8_t *p;
> + FadeContext *s = ctx->priv;
> + AVFrame *frame = arg;
> + int slice_h = frame->height / nb_jobs;
> + int slice_start = jobnr * slice_h;
> + int slice_end = (jobnr == nb_jobs - 1) ? frame->height : (jobnr + 1) *
> slice_h;
> + int i, j;
> +
> + for (i = slice_start; i < slice_end; i++) {
> + uint8_t *p = frame->data[0] + i * frame->linesize[0];
> + for (j = 0; j < frame->width * s->bpp; j++) {
> + /* s->factor is using 16 lower-order bits for decimal
> + * places. 32768 = 1 << 15, it is an integer representation
> + * of 0.5 and is for rounding. */
> + *p = (*p * s->factor + 32768) >> 16;
> + p++;
> + }
> + }
> +
> + return 0;
> +}
> +
> +static int filter_slice_chroma(AVFilterContext *ctx, void *arg, int jobnr,
> + int nb_jobs)
> +{
> + FadeContext *s = ctx->priv;
> + AVFrame *frame = arg;
> + int slice_h = FFALIGN(frame->height / nb_jobs, 1 << s->vsub);
> + int slice_start = jobnr * slice_h;
> + int slice_end = (jobnr == nb_jobs - 1) ? frame->height : (jobnr + 1) *
> slice_h;
> int i, j, plane;
>
> - if (s->factor < UINT16_MAX) {
> - /* luma or rgb plane */
> - for (i = 0; i < frame->height; i++) {
> - p = frame->data[0] + i * frame->linesize[0];
> - for (j = 0; j < inlink->w * s->bpp; j++) {
> - /* s->factor is using 16 lower-order bits for decimal
> - * places. 32768 = 1 << 15, it is an integer representation
> - * of 0.5 and is for rounding. */
> - *p = (*p * s->factor + 32768) >> 16;
> + for (plane = 1; plane < 3; plane++) {
> + for (i = slice_start; i < slice_end; i++) {
> + uint8_t *p = frame->data[plane] + (i >> s->vsub) *
> frame->linesize[plane];
> + for (j = 0; j < frame->width >> s->hsub; j++) {
> + /* 8421367 = ((128 << 1) + 1) << 15. It is an integer
> + * representation of 128.5. The .5 is for rounding
> + * purposes. */
> + *p = ((*p - 128) * s->factor + 8421367) >> 16;
> p++;
> }
> }
> + }
> +
> + return 0;
> +}
> +
> +static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
> +{
> + AVFilterContext *ctx = inlink->dst;
> + FadeContext *s = ctx->priv;
> + uint8_t *p;
Unused variable
> +
> + if (s->factor < UINT16_MAX) {
> + /* luma or rgb plane */
> + ctx->internal->execute(ctx, filter_slice_luma, frame, NULL,
> + FFMIN(frame->height, ctx->graph->nb_threads));
>
> if (frame->data[1] && frame->data[2]) {
> /* chroma planes */
> - for (plane = 1; plane < 3; plane++) {
> - for (i = 0; i < frame->height; i++) {
> - p = frame->data[plane] + (i >> s->vsub) *
> frame->linesize[plane];
> - for (j = 0; j < inlink->w >> s->hsub; j++) {
> - /* 8421367 = ((128 << 1) + 1) << 15. It is an integer
> - * representation of 128.5. The .5 is for rounding
> - * purposes. */
> - *p = ((*p - 128) * s->factor + 8421367) >> 16;
> - p++;
> - }
> - }
> - }
> + ctx->internal->execute(ctx, filter_slice_chroma, frame, NULL,
> + FFMIN(frame->height,
> ctx->graph->nb_threads));
> }
> }
>
> @@ -187,4 +219,5 @@ AVFilter avfilter_vf_fade = {
>
> .inputs = avfilter_vf_fade_inputs,
> .outputs = avfilter_vf_fade_outputs,
> + .flags = AVFILTER_FLAG_SLICE_THREADS,
> };
> --
> 1.7.10.4
>
>
Otherwise LGTM
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel