[FFmpeg-devel] [PATCH] avfilter/vf_scale: allow overriding in/out yuv colorspace type

Michael Niedermayer michaelni at gmx.at
Fri Jul 12 12:21:14 CEST 2013


On Fri, Jul 12, 2013 at 09:16:23AM +0200, Stefano Sabatini wrote:
> On date Friday 2013-07-12 00:52:08 +0200, Michael Niedermayer encoded:
> > Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> > ---
> >  doc/filters.texi       |   15 +++++++++++++++
> >  libavfilter/vf_scale.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 59 insertions(+)
> > 
> > diff --git a/doc/filters.texi b/doc/filters.texi
> > index 92f8612..5f6e11b 100644
> > --- a/doc/filters.texi
> > +++ b/doc/filters.texi
> > @@ -6201,6 +6201,21 @@ applies a bilinear scaling algorithm.
> >  @item size, s
> >  Set the video size, the value must be a valid abbreviation or in the
> >  form @var{width}x at var{height}.
> > +
> > + at item inyuvtype
> > + at item outyuvtype
> > +In/Output YCbCr colorspace type
> 
> Set in/output ...
> 
> > + at table @option
> 
> @table @samp

changed


> 
> > + at item jpeg
> > +Full 0-255 jpeg style
> > +
> > + at item 709
> > +ITU Rec BT709
> > +
> > + at item 601
> > +ITU Rec BT601
> > + at end table
> > +
> >  @end table
> 
> Which is the default value?

what it was before, when the option isnt specified, thats not a
constant independant of the pixel format


> 
> >  The values of the @var{w} and @var{h} options are expressions
> > diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c
> > index b1246fe..481eb85 100644
> > --- a/libavfilter/vf_scale.c
> > +++ b/libavfilter/vf_scale.c
> > @@ -90,6 +90,9 @@ typedef struct {
> >      char *w_expr;               ///< width  expression string
> >      char *h_expr;               ///< height expression string
> >      char *flags_str;
> > +
> > +    char *inyuvtype;
> > +    char *outyuvtype;
> 
> Did you consider to use named constants instead?

yes


> 
> >  } ScaleContext;
> >  
> >  static av_cold int init(AVFilterContext *ctx)
> > @@ -182,6 +185,21 @@ static int query_formats(AVFilterContext *ctx)
> >      return 0;
> >  }
> >  
> > +static const int *parse_yuv_type(const char *s, int *full)
> > +{
> > +    const static int32_t yuv2rgb_coeffs[2][4] = {
> > +        { 117504, 138453, 13954, 34903 }, /* ITU-R Rec. 709 (1990) */
> > +        { 104597, 132201, 25675, 53279 }, /* ITU-R Rec. 624-4 System B, G */
> > +    };
> > +
> > +    if (s && (strstr(s, "full") || strstr(s, "jpeg")))
> > +        *full = 1;
> > +    if (s && strstr(s, "709")) {
> > +        return yuv2rgb_coeffs[0];
> > +    } /*else if (s && strstr(s, "601"))*/
> > +        return yuv2rgb_coeffs[1];
> > +}
> > +
> >  static int config_props(AVFilterLink *outlink)
> >  {
> >      AVFilterContext *ctx = outlink->src;
> > @@ -279,6 +297,30 @@ static int config_props(AVFilterLink *outlink)
> >                                          scale->flags, NULL, NULL, NULL);
> >          if (!scale->sws || !scale->isws[0] || !scale->isws[1])
> >              return AVERROR(EINVAL);
> > +
> > +        if (scale->inyuvtype || scale->outyuvtype) {
> > +            int in_full, out_full, brightness, contrast, saturation;
> > +            const int *inv_table, *table;
> > +
> > +            sws_getColorspaceDetails(scale->sws, (int **)&inv_table, &in_full,
> > +                                     (int **)&table, &out_full,
> > +                                     &brightness, &contrast, &saturation);
> > +
> > +            if (scale->inyuvtype)
> > +                inv_table = parse_yuv_type(scale->inyuvtype, &in_full);
> > +            if (scale->outyuvtype)
> > +                table     = parse_yuv_type(scale->outyuvtype, &out_full);
> > +
> > +            sws_setColorspaceDetails(scale->sws, inv_table, in_full,
> > +                                     table, out_full,
> > +                                     brightness, contrast, saturation);
> > +            sws_setColorspaceDetails(scale->isws[0], inv_table, in_full,
> > +                                     table, out_full,
> > +                                     brightness, contrast, saturation);
> > +            sws_setColorspaceDetails(scale->isws[1], inv_table, in_full,
> > +                                     table, out_full,
> > +                                     brightness, contrast, saturation);
> > +        }
> >      }
> >  
> >      if (inlink->sample_aspect_ratio.num){
> > @@ -398,6 +440,8 @@ static const AVOption scale_options[] = {
> >      { "interl", "set interlacing", OFFSET(interlaced), AV_OPT_TYPE_INT, {.i64 = 0 }, -1, 1, FLAGS },
> >      { "size",   "set video size",          OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, FLAGS },
> >      { "s",      "set video size",          OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, FLAGS },
> 
> > +    {  "inyuvtype", "Input YCbCr type",     OFFSET(inyuvtype),  AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
> > +    { "outyuvtype", "Output YCbCr type",    OFFSET(outyuvtype), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
> 
> set input ...
> set output ...

changed

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Many things microsoft did are stupid, but not doing something just because
microsoft did it is even more stupid. If everything ms did were stupid they
would be bankrupt already.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130712/6ecac042/attachment.asc>


More information about the ffmpeg-devel mailing list