[FFmpeg-soc] [soc]: r1932 - libavfilter/vf_scale.c

Bobby Bingham uhmmmm at gmail.com
Thu Feb 28 00:42:17 CET 2008


On Thu, 28 Feb 2008 00:18:59 +0100 (CET)
koorogi <subversion at mplayerhq.hu> wrote:

> Author: koorogi
> Date: Thu Feb 28 00:18:58 2008
> New Revision: 1932
> 
> Log:
> Slice support for vf_scale.
> 
> 
> Modified:
>    libavfilter/vf_scale.c
> 
> Modified: libavfilter/vf_scale.c
> ==============================================================================
> --- libavfilter/vf_scale.c	(original)
> +++ libavfilter/vf_scale.c	Thu Feb 28 00:18:58 2008
> @@ -34,6 +34,8 @@ typedef struct
>       *  -1 = keep original aspect
>       */
>      int w, h;
> +
> +    int sliceY;                 ///< top of current output slice
>  } ScaleContext;
>  
>  static int init(AVFilterContext *ctx, const char *args, void *opaque)
> @@ -110,6 +112,7 @@ static int config_props(AVFilterLink *li
>  
>  static void start_frame(AVFilterLink *link, AVFilterPicRef *picref)
>  {
> +    ScaleContext *scale = link->dst->priv;
>      AVFilterLink *out = link->dst->outputs[0];
>  
>      out->outpic      = avfilter_get_video_buffer(out, AV_PERM_WRITE);
> @@ -122,22 +125,20 @@ static void start_frame(AVFilterLink *li
>           FFMAX(out->outpic->pixel_aspect.num,
> out->outpic->pixel_aspect.den)); 
>      avfilter_start_frame(out, avfilter_ref_pic(out->outpic, ~0));
> -}
>  
> +    scale->sliceY = 0;
> +}
>  
> -/* TODO: figure out the swscale API well enough to scale slice at a
> time */ -static void end_frame(AVFilterLink *link)
> +static void draw_slice(AVFilterLink *link, int y, int h)
>  {
>      ScaleContext *scale = link->dst->priv;
> +    int outH;
>  
> -    sws_scale(scale->sws, link->cur_pic->data,
> link->cur_pic->linesize, 0,
> -              link->cur_pic->h, link->dst->outputs[0]->outpic->data,
> +    outH = sws_scale(scale->sws, link->cur_pic->data,
> link->cur_pic->linesize,
> +              y, h, link->dst->outputs[0]->outpic->data,
>                link->dst->outputs[0]->outpic->linesize);
> -    avfilter_draw_slice(link->dst->outputs[0], 0,
> link->dst->outputs[0]->h);
> -    avfilter_end_frame(link->dst->outputs[0]);
> -
> -    avfilter_unref_pic(link->cur_pic);
> -    avfilter_unref_pic(link->dst->outputs[0]->outpic);
> +    avfilter_draw_slice(link->dst->outputs[0], scale->sliceY, outH);
> +    scale->sliceY += outH;
>  }
>  
>  AVFilter avfilter_vf_scale =
> @@ -154,7 +155,7 @@ AVFilter avfilter_vf_scale =
>      .inputs    = (AVFilterPad[]) {{ .name            = "default",
>                                      .type            =
> CODEC_TYPE_VIDEO, .start_frame     = start_frame,
> -                                    .end_frame       = end_frame,
> +                                    .draw_slice      = draw_slice,
>                                      .min_perms       =
> AV_PERM_READ, }, { .name = NULL}},
>      .outputs   = (AVFilterPad[]) {{ .name            = "default",

After some more testing, it seems this doesn't work right with
--enable-swscaler. I'll take a closer look at it later tonight.

-- 
Bobby Bingham
Never trust atoms.  Or anything made of atoms.
このメールは再利用されたバイトでできている。



More information about the FFmpeg-soc mailing list