[FFmpeg-devel] [PATCH 2/2] avfilter/vf_scale: allow overriding in/out yuv colorspace type
Michael Niedermayer
michaelni at gmx.at
Mon Jul 15 01:19:34 CEST 2013
On Sun, Jul 14, 2013 at 07:49:58PM +0000, Paul B Mahol wrote:
> On 7/14/13, Michael Niedermayer <michaelni at gmx.at> wrote:
> > On Sun, Jul 14, 2013 at 06:32:51PM +0000, Paul B Mahol wrote:
> >> On 7/14/13, Michael Niedermayer <michaelni at gmx.at> wrote:
> >> > On Sun, Jul 14, 2013 at 05:20:57PM +0000, Paul B Mahol wrote:
> >> >> On 7/14/13, Michael Niedermayer <michaelni at gmx.at> wrote:
> >> >> > This also uses the decoders yuy type if "auto" is specified
> >> >> >
> >> >> > Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> >> >> > ---
> >> >> > doc/filters.texi | 30 ++++++++++++++++++++++++
> >> >> > libavfilter/vf_scale.c | 61
> >> >> > ++++++++++++++++++++++++++++++++++++++++++++++++
> >> >> > 2 files changed, 91 insertions(+)
> >> >> >
> >> >> > diff --git a/doc/filters.texi b/doc/filters.texi
> >> >> > index 6f3994a..579f28b 100644
> >> >> > --- a/doc/filters.texi
> >> >> > +++ b/doc/filters.texi
> >> >> > @@ -6210,6 +6210,36 @@ 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
> >> >> > +Set in/output YCbCr colorspace type.
> >> >> > +This allows the autodetected value to be overridden as well as
> >> >> > allows
> >> >> > forcing
> >> >> > +a specific value used for the output and encoder.
> >> >> > +If not specified, the colorspace type depends on the pixel format.
> >> >> > + at table @samp
> >> >> > + at item auto
> >> >> > +Choose automatically
> >> >> > +
> >> >> > + at item jpeg
> >> >> > +Full 0-255 jpeg style
> >> >> > +
> >> >> > + at item bt709
> >> >> > +ITU Rec BT709
> >> >> > +
> >> >> > + at item fcc
> >> >> > +United States Federal Communications Commission Title 47 Code of
> >> >> > +Federal Regulations (2003) 73.682 (a)
> >> >> > +
> >> >> > + at item bt601
> >> >> > +ITU Rec BT601
> >> >> > +ITU-R Rec. BT.470-6 System B, G
> >> >> > +Society of Motion Picture and Television Engineers 170M (2004)
> >> >> > +
> >> >> > + at item smpte240m
> >> >> > +Society of Motion Picture and Television Engineers 240M
> >> >> > + at end table
> >> >> > +
> >> >> > @end table
> >> >> >
> >> >> > 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..4625167 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;
> >> >> > } ScaleContext;
> >> >> >
> >> >> > static av_cold int init(AVFilterContext *ctx)
> >> >> > @@ -182,6 +185,40 @@ static int query_formats(AVFilterContext *ctx)
> >> >> > return 0;
> >> >> > }
> >> >> >
> >> >> > +static const int *parse_yuv_type(const char *s, int *full, enum
> >> >> > AVColorSpace colorspace)
> >> >> > +{
> >> >> > + const static int32_t yuv2rgb_coeffs[8][4] = {
> >> >> > + {},
> >> >> > + { 117504, 138453, 13954, 34903 }, /* ITU-R Rec. 709 (1990)
> >> >> > */
> >> >> > + { 104597, 132201, 25675, 53279 }, /* unspecified */
> >> >> > + { 104597, 132201, 25675, 53279 }, /* reserved */
> >> >> > + { 104448, 132798, 24759, 53109 }, /* FCC */
> >> >> > + { 104597, 132201, 25675, 53279 }, /* ITU-R Rec. 624-4 System
> >> >> > B,
> >> >> > G
> >> >> > */
> >> >> > + { 104597, 132201, 25675, 53279 }, /* SMPTE 170M */
> >> >> > + { 117579, 136230, 16907, 35559 } /* SMPTE 240M (1987) */
> >> >> > + };
> >> >> > + if (!s)
> >> >> > + s = "bt601";
> >> >> > +
> >> >> > + if (s && (strstr(s, "full") || strstr(s, "jpeg")))
> >> >> > + *full = 1;
> >> >> > + if (s && strstr(s, "bt709")) {
> >> >> > + colorspace = AVCOL_SPC_BT709;
> >> >> > + } else if (s && strstr(s, "fcc")) {
> >> >> > + colorspace = AVCOL_SPC_FCC;
> >> >> > + } else if (s && strstr(s, "smpte240m")) {
> >> >> > + colorspace = AVCOL_SPC_SMPTE240M;
> >> >> > + } else if (s && (strstr(s, "bt601") || strstr(s, "bt470") ||
> >> >> > strstr(s,
> >> >> > "smpte170m"))) {
> >> >> > + colorspace = AVCOL_SPC_BT470BG;
> >> >> > + }
> >> >> > +
> >> >> > + if (colorspace < 1 || colorspace > 7) {
> >> >> > + colorspace = AVCOL_SPC_BT470BG;
> >> >> > + }
> >> >> > +
> >> >> > + return yuv2rgb_coeffs[colorspace];
> >> >> > +}
> >> >> > +
> >> >> > static int config_props(AVFilterLink *outlink)
> >> >> > {
> >> >> > AVFilterContext *ctx = outlink->src;
> >> >> > @@ -370,6 +407,28 @@ static int filter_frame(AVFilterLink *link,
> >> >> > AVFrame
> >> >> > *in)
> >> >> > if(scale->output_is_pal)
> >> >> > avpriv_set_systematic_pal2((uint32_t*)out->data[1],
> >> >> > outlink->format
> >> >> > == AV_PIX_FMT_PAL8 ? AV_PIX_FMT_BGR8 : outlink->format);
> >> >> >
> >> >> > + 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);
> >> >> > +
> >> >> > + inv_table = parse_yuv_type(scale->inyuvtype, &in_full,
> >> >> > av_frame_get_colorspace(in));
> >> >> > + table = parse_yuv_type(scale->outyuvtype, &out_full,
> >> >> > AVCOL_SPC_UNSPECIFIED);
> >> >> > +
> >> >> > + 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);
> >> >> > + }
> >> >> > +
> >> >> > av_reduce(&out->sample_aspect_ratio.num,
> >> >> > &out->sample_aspect_ratio.den,
> >> >> > (int64_t)in->sample_aspect_ratio.num * outlink->h *
> >> >> > link->w,
> >> >> > (int64_t)in->sample_aspect_ratio.den * outlink->w *
> >> >> > link->h,
> >> >> > @@ -398,6 +457,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", "set input YCbCr type", OFFSET(inyuvtype),
> >> >> > AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
> >> >> > + { "outyuvtype", "set output YCbCr type", OFFSET(outyuvtype),
> >> >> > AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
> >> >>
> >> >> As stefano already pointed out use named constans so user can see what
> >> >> can
> >> >> be
> >> >> set for in/out yuv type.
> >> >
> >> > as already said this prevents other matrixes from being
> >> > specified.
> >> > that is like "0.299, 0.123, 0.555"
> >>
> >> Why you think that? Other matrixes are other matrixes, and you should
> >> have
> >> special option to specify them.
> >
> > thats like
> > -size qcif
> > -size cif
> > -litteral_size 100x100
>
> That is not exacly same, as qcif/cif/ .. are not listed at all.
>
> Also it seems little akward to me that in same option one can give
> custom matrix and already available one.
yes
Do people want me to change the patch somehow or are they ok with it
as it is. I dont mind changing it but such request must come with
understanding of the sideeffects
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
I do not agree with what you have to say, but I'll defend to the death your
right to say it. -- Voltaire
-------------- 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/20130715/fb246e99/attachment.asc>
More information about the ffmpeg-devel
mailing list