Message ID | 20180320225946.12956-1-michael@niedermayer.cc |
---|---|
State | New |
Headers | show |
On 3/20/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> > --- > libavfilter/vf_scale.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c > index 9f45032e85..2f6fa4791d 100644 > --- a/libavfilter/vf_scale.c > +++ b/libavfilter/vf_scale.c > @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) > AVFilterLink *outlink = link->dst->outputs[0]; > AVFrame *out; > const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); > + const AVPixFmtDescriptor *out_desc = > av_pix_fmt_desc_get(outlink->format); > char buf[32]; > int in_range; > > @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, AVFrame > *in) > table, out_full, > brightness, contrast, saturation); > > - out->color_range = out_full ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; > + // color_range describes YUV, it is undefined for RGB > + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && > out_desc->nb_components != 1) { > + out->color_range = AVCOL_RANGE_UNSPECIFIED; > + } else > + out->color_range = out_full ? AVCOL_RANGE_JPEG : > AVCOL_RANGE_MPEG; > } > > av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den, > -- > 2.16.2 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > This is not optimal, as full color_range should remain full when not changed.
On Tue, 20 Mar 2018 23:59:46 +0100 Michael Niedermayer <michael@niedermayer.cc> wrote: > Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> > --- > libavfilter/vf_scale.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c > index 9f45032e85..2f6fa4791d 100644 > --- a/libavfilter/vf_scale.c > +++ b/libavfilter/vf_scale.c > @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) > AVFilterLink *outlink = link->dst->outputs[0]; > AVFrame *out; > const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); > + const AVPixFmtDescriptor *out_desc = av_pix_fmt_desc_get(outlink->format); > char buf[32]; > int in_range; > > @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) > table, out_full, > brightness, contrast, saturation); > > - out->color_range = out_full ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; > + // color_range describes YUV, it is undefined for RGB > + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && out_desc->nb_components != 1) { > + out->color_range = AVCOL_RANGE_UNSPECIFIED; > + } else > + out->color_range = out_full ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; > } > > av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den, Why is it not setting full range for gray? PNGs can use this for grayscale images, so they would be affected by this too.
On Wed, Mar 21, 2018 at 03:04:35PM +0100, wm4 wrote: > On Tue, 20 Mar 2018 23:59:46 +0100 > Michael Niedermayer <michael@niedermayer.cc> wrote: > > > Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> > > --- > > libavfilter/vf_scale.c | 7 ++++++- > > 1 file changed, 6 insertions(+), 1 deletion(-) > > > > diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c > > index 9f45032e85..2f6fa4791d 100644 > > --- a/libavfilter/vf_scale.c > > +++ b/libavfilter/vf_scale.c > > @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) > > AVFilterLink *outlink = link->dst->outputs[0]; > > AVFrame *out; > > const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); > > + const AVPixFmtDescriptor *out_desc = av_pix_fmt_desc_get(outlink->format); > > char buf[32]; > > int in_range; > > > > @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) > > table, out_full, > > brightness, contrast, saturation); > > > > - out->color_range = out_full ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; > > + // color_range describes YUV, it is undefined for RGB > > + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && out_desc->nb_components != 1) { > > + out->color_range = AVCOL_RANGE_UNSPECIFIED; > > + } else > > + out->color_range = out_full ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; > > } > > > > av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den, > > Why is it not setting full range for gray? PNGs can use this for > grayscale images, so they would be affected by this too. I do not understand what you describe here. Please describe the issue clearer and or provide a testcase. there is no unique gray pixel format. gray8 is not a AV_PIX_FMT_FLAG_RGB format, thus its treated the same as before this patch [...]
On Wed, Mar 21, 2018 at 09:18:21AM +0100, Paul B Mahol wrote: > On 3/20/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > > Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> > > --- > > libavfilter/vf_scale.c | 7 ++++++- > > 1 file changed, 6 insertions(+), 1 deletion(-) > > > > diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c > > index 9f45032e85..2f6fa4791d 100644 > > --- a/libavfilter/vf_scale.c > > +++ b/libavfilter/vf_scale.c > > @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) > > AVFilterLink *outlink = link->dst->outputs[0]; > > AVFrame *out; > > const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); > > + const AVPixFmtDescriptor *out_desc = > > av_pix_fmt_desc_get(outlink->format); > > char buf[32]; > > int in_range; > > > > @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, AVFrame > > *in) > > table, out_full, > > brightness, contrast, saturation); > > > > - out->color_range = out_full ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; > > + // color_range describes YUV, it is undefined for RGB > > + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && > > out_desc->nb_components != 1) { > > + out->color_range = AVCOL_RANGE_UNSPECIFIED; > > + } else > > + out->color_range = out_full ? AVCOL_RANGE_JPEG : > > AVCOL_RANGE_MPEG; > > } > > > > av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den, > > -- > > 2.16.2 > > > > _______________________________________________ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > > > This is not optimal, as full color_range should remain full when not changed. there is no range for rgb formats. The range is specific to YUV based formats. Thats, if iam guessing correctly what you meant. You did not really say which case you meant here. So maybe there is an issue and i misunderstand what you refer to [...]
On 3/26/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > On Wed, Mar 21, 2018 at 09:18:21AM +0100, Paul B Mahol wrote: >> On 3/20/18, Michael Niedermayer <michael@niedermayer.cc> wrote: >> > Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> >> > --- >> > libavfilter/vf_scale.c | 7 ++++++- >> > 1 file changed, 6 insertions(+), 1 deletion(-) >> > >> > diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c >> > index 9f45032e85..2f6fa4791d 100644 >> > --- a/libavfilter/vf_scale.c >> > +++ b/libavfilter/vf_scale.c >> > @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame >> > *in) >> > AVFilterLink *outlink = link->dst->outputs[0]; >> > AVFrame *out; >> > const AVPixFmtDescriptor *desc = >> > av_pix_fmt_desc_get(link->format); >> > + const AVPixFmtDescriptor *out_desc = >> > av_pix_fmt_desc_get(outlink->format); >> > char buf[32]; >> > int in_range; >> > >> > @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, >> > AVFrame >> > *in) >> > table, out_full, >> > brightness, contrast, >> > saturation); >> > >> > - out->color_range = out_full ? AVCOL_RANGE_JPEG : >> > AVCOL_RANGE_MPEG; >> > + // color_range describes YUV, it is undefined for RGB >> > + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && >> > out_desc->nb_components != 1) { >> > + out->color_range = AVCOL_RANGE_UNSPECIFIED; >> > + } else >> > + out->color_range = out_full ? AVCOL_RANGE_JPEG : >> > AVCOL_RANGE_MPEG; >> > } >> > >> > av_reduce(&out->sample_aspect_ratio.num, >> > &out->sample_aspect_ratio.den, >> > -- >> > 2.16.2 >> > >> > _______________________________________________ >> > ffmpeg-devel mailing list >> > ffmpeg-devel@ffmpeg.org >> > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> > >> >> This is not optimal, as full color_range should remain full when not >> changed. > > there is no range for rgb formats. The range is specific to YUV based > formats. > Thats, if iam guessing correctly what you meant. You did not really say > which case you meant here. So maybe there is an issue and i misunderstand > what you refer to Maybe not for swscale here but does exist otherwise. > > [...] > > -- > 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. >
> >> This is not optimal, as full color_range should remain full when not > >> changed. > > > > there is no range for rgb formats. The range is specific to YUV based > > formats. > > Thats, if iam guessing correctly what you meant. You did not really say > > which case you meant here. So maybe there is an issue and i misunderstand > > what you refer to > > Maybe not for swscale here but does exist otherwise. > > What software use limited for rgb ? I understand for gray (it can be gray of yuv data (limited or full) or gray for RGB data)), but for RGB/RGBA, never see limited (and doesn't see the interest :-) Martin
On 3/26/18, Martin Vignali <martin.vignali@gmail.com> wrote: >> >> This is not optimal, as full color_range should remain full when not >> >> changed. >> > >> > there is no range for rgb formats. The range is specific to YUV based >> > formats. >> > Thats, if iam guessing correctly what you meant. You did not really say >> > which case you meant here. So maybe there is an issue and i >> > misunderstand >> > what you refer to >> >> Maybe not for swscale here but does exist otherwise. >> >> What software use limited for rgb ? > > I understand for gray (it can be gray of yuv data (limited or full) or gray > for RGB data)), > but for RGB/RGBA, never see limited (and doesn't see the interest :-) > > Martin > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > OK then, just apply patch.
On Mon, Mar 26, 2018 at 08:34:06AM +0200, Paul B Mahol wrote: > On 3/26/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > > On Wed, Mar 21, 2018 at 09:18:21AM +0100, Paul B Mahol wrote: > >> On 3/20/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > >> > Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> > >> > --- > >> > libavfilter/vf_scale.c | 7 ++++++- > >> > 1 file changed, 6 insertions(+), 1 deletion(-) > >> > > >> > diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c > >> > index 9f45032e85..2f6fa4791d 100644 > >> > --- a/libavfilter/vf_scale.c > >> > +++ b/libavfilter/vf_scale.c > >> > @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame > >> > *in) > >> > AVFilterLink *outlink = link->dst->outputs[0]; > >> > AVFrame *out; > >> > const AVPixFmtDescriptor *desc = > >> > av_pix_fmt_desc_get(link->format); > >> > + const AVPixFmtDescriptor *out_desc = > >> > av_pix_fmt_desc_get(outlink->format); > >> > char buf[32]; > >> > int in_range; > >> > > >> > @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, > >> > AVFrame > >> > *in) > >> > table, out_full, > >> > brightness, contrast, > >> > saturation); > >> > > >> > - out->color_range = out_full ? AVCOL_RANGE_JPEG : > >> > AVCOL_RANGE_MPEG; > >> > + // color_range describes YUV, it is undefined for RGB > >> > + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && > >> > out_desc->nb_components != 1) { > >> > + out->color_range = AVCOL_RANGE_UNSPECIFIED; > >> > + } else > >> > + out->color_range = out_full ? AVCOL_RANGE_JPEG : > >> > AVCOL_RANGE_MPEG; > >> > } > >> > > >> > av_reduce(&out->sample_aspect_ratio.num, > >> > &out->sample_aspect_ratio.den, > >> > -- > >> > 2.16.2 > >> > > >> > _______________________________________________ > >> > ffmpeg-devel mailing list > >> > ffmpeg-devel@ffmpeg.org > >> > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > >> > > >> > >> This is not optimal, as full color_range should remain full when not > >> changed. > > > > there is no range for rgb formats. The range is specific to YUV based > > formats. > > Thats, if iam guessing correctly what you meant. You did not really say > > which case you meant here. So maybe there is an issue and i misunderstand > > what you refer to > > Maybe not for swscale here but does exist otherwise. It has no meaning for RGB. There is no limited range RGB also, the API defines it only for YUV. So if it had meaning for RGB its not defined what meaning that would be. The ranges for luma and chroma differ so its not natural or obvious how to extend it to RGB. Iam also not aware of any specification that defines limited range RGB also please be a little more verbose about what you speak of. That should speed up resolving this /** * MPEG vs JPEG YUV range. */ enum AVColorRange { AVCOL_RANGE_UNSPECIFIED = 0, AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges AVCOL_RANGE_NB ///< Not part of ABI [...]
On Mon, Mar 26, 2018 at 12:50:41PM +0200, Paul B Mahol wrote: > On 3/26/18, Martin Vignali <martin.vignali@gmail.com> wrote: > >> >> This is not optimal, as full color_range should remain full when not > >> >> changed. > >> > > >> > there is no range for rgb formats. The range is specific to YUV based > >> > formats. > >> > Thats, if iam guessing correctly what you meant. You did not really say > >> > which case you meant here. So maybe there is an issue and i > >> > misunderstand > >> > what you refer to > >> > >> Maybe not for swscale here but does exist otherwise. > >> > >> What software use limited for rgb ? > > > > I understand for gray (it can be gray of yuv data (limited or full) or gray > > for RGB data)), > > but for RGB/RGBA, never see limited (and doesn't see the interest :-) > > > > Martin > > _______________________________________________ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > > > OK then, just apply patch. ok, will apply thanks! [...]
On 26/03/18 22:44, Michael Niedermayer wrote: > On Mon, Mar 26, 2018 at 08:34:06AM +0200, Paul B Mahol wrote: >> On 3/26/18, Michael Niedermayer <michael@niedermayer.cc> wrote: >>> On Wed, Mar 21, 2018 at 09:18:21AM +0100, Paul B Mahol wrote: >>>> On 3/20/18, Michael Niedermayer <michael@niedermayer.cc> wrote: >>>>> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> >>>>> --- >>>>> libavfilter/vf_scale.c | 7 ++++++- >>>>> 1 file changed, 6 insertions(+), 1 deletion(-) >>>>> >>>>> diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c >>>>> index 9f45032e85..2f6fa4791d 100644 >>>>> --- a/libavfilter/vf_scale.c >>>>> +++ b/libavfilter/vf_scale.c >>>>> @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame >>>>> *in) >>>>> AVFilterLink *outlink = link->dst->outputs[0]; >>>>> AVFrame *out; >>>>> const AVPixFmtDescriptor *desc = >>>>> av_pix_fmt_desc_get(link->format); >>>>> + const AVPixFmtDescriptor *out_desc = >>>>> av_pix_fmt_desc_get(outlink->format); >>>>> char buf[32]; >>>>> int in_range; >>>>> >>>>> @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, >>>>> AVFrame >>>>> *in) >>>>> table, out_full, >>>>> brightness, contrast, >>>>> saturation); >>>>> >>>>> - out->color_range = out_full ? AVCOL_RANGE_JPEG : >>>>> AVCOL_RANGE_MPEG; >>>>> + // color_range describes YUV, it is undefined for RGB >>>>> + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && >>>>> out_desc->nb_components != 1) { >>>>> + out->color_range = AVCOL_RANGE_UNSPECIFIED; >>>>> + } else >>>>> + out->color_range = out_full ? AVCOL_RANGE_JPEG : >>>>> AVCOL_RANGE_MPEG; >>>>> } >>>>> >>>>> av_reduce(&out->sample_aspect_ratio.num, >>>>> &out->sample_aspect_ratio.den, >>>>> -- >>>>> 2.16.2 >>>>> >>>> >>>> This is not optimal, as full color_range should remain full when not >>>> changed. >>> >>> there is no range for rgb formats. The range is specific to YUV based >>> formats. >>> Thats, if iam guessing correctly what you meant. You did not really say >>> which case you meant here. So maybe there is an issue and i misunderstand >>> what you refer to >> >> Maybe not for swscale here but does exist otherwise. > > It has no meaning for RGB. There is no limited range RGB > also, the API defines it only for YUV. So if it had meaning for RGB its not defined > what meaning that would be. The ranges for luma and chroma differ so its not > natural or obvious how to extend it to RGB. > Iam also not aware of any specification that defines limited range RGB See HDMI, HD-SDI, CEA-861, pretty much anything related to sending RGB over wires in a non-PC context. (No comment on whether it is useful to include it, but dismissing limited range RGB as not a thing is probably not a good idea. I would kindof expect things like DeckLink to be using limited-range RGB everywhere, but I'm not familiar with the details there.) - Mark
On Mon, Mar 26, 2018 at 10:56:47PM +0100, Mark Thompson wrote: > On 26/03/18 22:44, Michael Niedermayer wrote: > > On Mon, Mar 26, 2018 at 08:34:06AM +0200, Paul B Mahol wrote: > >> On 3/26/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > >>> On Wed, Mar 21, 2018 at 09:18:21AM +0100, Paul B Mahol wrote: > >>>> On 3/20/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > >>>>> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> > >>>>> --- > >>>>> libavfilter/vf_scale.c | 7 ++++++- > >>>>> 1 file changed, 6 insertions(+), 1 deletion(-) > >>>>> > >>>>> diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c > >>>>> index 9f45032e85..2f6fa4791d 100644 > >>>>> --- a/libavfilter/vf_scale.c > >>>>> +++ b/libavfilter/vf_scale.c > >>>>> @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame > >>>>> *in) > >>>>> AVFilterLink *outlink = link->dst->outputs[0]; > >>>>> AVFrame *out; > >>>>> const AVPixFmtDescriptor *desc = > >>>>> av_pix_fmt_desc_get(link->format); > >>>>> + const AVPixFmtDescriptor *out_desc = > >>>>> av_pix_fmt_desc_get(outlink->format); > >>>>> char buf[32]; > >>>>> int in_range; > >>>>> > >>>>> @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, > >>>>> AVFrame > >>>>> *in) > >>>>> table, out_full, > >>>>> brightness, contrast, > >>>>> saturation); > >>>>> > >>>>> - out->color_range = out_full ? AVCOL_RANGE_JPEG : > >>>>> AVCOL_RANGE_MPEG; > >>>>> + // color_range describes YUV, it is undefined for RGB > >>>>> + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && > >>>>> out_desc->nb_components != 1) { > >>>>> + out->color_range = AVCOL_RANGE_UNSPECIFIED; > >>>>> + } else > >>>>> + out->color_range = out_full ? AVCOL_RANGE_JPEG : > >>>>> AVCOL_RANGE_MPEG; > >>>>> } > >>>>> > >>>>> av_reduce(&out->sample_aspect_ratio.num, > >>>>> &out->sample_aspect_ratio.den, > >>>>> -- > >>>>> 2.16.2 > >>>>> > >>>> > >>>> This is not optimal, as full color_range should remain full when not > >>>> changed. > >>> > >>> there is no range for rgb formats. The range is specific to YUV based > >>> formats. > >>> Thats, if iam guessing correctly what you meant. You did not really say > >>> which case you meant here. So maybe there is an issue and i misunderstand > >>> what you refer to > >> > >> Maybe not for swscale here but does exist otherwise. > > > > It has no meaning for RGB. There is no limited range RGB > > also, the API defines it only for YUV. So if it had meaning for RGB its not defined > > what meaning that would be. The ranges for luma and chroma differ so its not > > natural or obvious how to extend it to RGB. > > Iam also not aware of any specification that defines limited range RGB > See HDMI, HD-SDI, CEA-861, pretty much anything related to sending RGB over wires in a non-PC context. > > (No comment on whether it is useful to include it, but dismissing limited range RGB as not a thing is probably not a good idea. I would kindof expect things like DeckLink to be using limited-range RGB everywhere, but I'm not familiar with the details there.) interresting, i was unaware of this are these specs publically available ? i could find CEA-861 but not the others quickly thx [...]
On Mon, Mar 26, 2018 at 10:56:47PM +0100, Mark Thompson wrote: > On 26/03/18 22:44, Michael Niedermayer wrote: > > On Mon, Mar 26, 2018 at 08:34:06AM +0200, Paul B Mahol wrote: > >> On 3/26/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > >>> On Wed, Mar 21, 2018 at 09:18:21AM +0100, Paul B Mahol wrote: > >>>> On 3/20/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > >>>>> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> > >>>>> --- > >>>>> libavfilter/vf_scale.c | 7 ++++++- > >>>>> 1 file changed, 6 insertions(+), 1 deletion(-) > >>>>> > >>>>> diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c > >>>>> index 9f45032e85..2f6fa4791d 100644 > >>>>> --- a/libavfilter/vf_scale.c > >>>>> +++ b/libavfilter/vf_scale.c > >>>>> @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame > >>>>> *in) > >>>>> AVFilterLink *outlink = link->dst->outputs[0]; > >>>>> AVFrame *out; > >>>>> const AVPixFmtDescriptor *desc = > >>>>> av_pix_fmt_desc_get(link->format); > >>>>> + const AVPixFmtDescriptor *out_desc = > >>>>> av_pix_fmt_desc_get(outlink->format); > >>>>> char buf[32]; > >>>>> int in_range; > >>>>> > >>>>> @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, > >>>>> AVFrame > >>>>> *in) > >>>>> table, out_full, > >>>>> brightness, contrast, > >>>>> saturation); > >>>>> > >>>>> - out->color_range = out_full ? AVCOL_RANGE_JPEG : > >>>>> AVCOL_RANGE_MPEG; > >>>>> + // color_range describes YUV, it is undefined for RGB > >>>>> + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && > >>>>> out_desc->nb_components != 1) { > >>>>> + out->color_range = AVCOL_RANGE_UNSPECIFIED; > >>>>> + } else > >>>>> + out->color_range = out_full ? AVCOL_RANGE_JPEG : > >>>>> AVCOL_RANGE_MPEG; > >>>>> } > >>>>> > >>>>> av_reduce(&out->sample_aspect_ratio.num, > >>>>> &out->sample_aspect_ratio.den, > >>>>> -- > >>>>> 2.16.2 > >>>>> > >>>> > >>>> This is not optimal, as full color_range should remain full when not > >>>> changed. > >>> > >>> there is no range for rgb formats. The range is specific to YUV based > >>> formats. > >>> Thats, if iam guessing correctly what you meant. You did not really say > >>> which case you meant here. So maybe there is an issue and i misunderstand > >>> what you refer to > >> > >> Maybe not for swscale here but does exist otherwise. > > > > It has no meaning for RGB. There is no limited range RGB > > also, the API defines it only for YUV. So if it had meaning for RGB its not defined > > what meaning that would be. The ranges for luma and chroma differ so its not > > natural or obvious how to extend it to RGB. > > Iam also not aware of any specification that defines limited range RGB > See HDMI, HD-SDI, CEA-861, pretty much anything related to sending RGB over wires in a non-PC context. > > (No comment on whether it is useful to include it, but dismissing limited range RGB as not a thing is probably not a good idea. I would kindof expect things like DeckLink to be using limited-range RGB everywhere, but I'm not familiar with the details there.) Is this used just over wires or also in software ? aka should we update our enum to also cover this and If yes then we also probably should add support for this to swscale thx [...]
On Tue, 27 Mar 2018 12:14:55 +0200 Michael Niedermayer <michael@niedermayer.cc> wrote: > On Mon, Mar 26, 2018 at 10:56:47PM +0100, Mark Thompson wrote: > > On 26/03/18 22:44, Michael Niedermayer wrote: > > > On Mon, Mar 26, 2018 at 08:34:06AM +0200, Paul B Mahol wrote: > > >> On 3/26/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > > >>> On Wed, Mar 21, 2018 at 09:18:21AM +0100, Paul B Mahol wrote: > > >>>> On 3/20/18, Michael Niedermayer <michael@niedermayer.cc> wrote: > > >>>>> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> > > >>>>> --- > > >>>>> libavfilter/vf_scale.c | 7 ++++++- > > >>>>> 1 file changed, 6 insertions(+), 1 deletion(-) > > >>>>> > > >>>>> diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c > > >>>>> index 9f45032e85..2f6fa4791d 100644 > > >>>>> --- a/libavfilter/vf_scale.c > > >>>>> +++ b/libavfilter/vf_scale.c > > >>>>> @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame > > >>>>> *in) > > >>>>> AVFilterLink *outlink = link->dst->outputs[0]; > > >>>>> AVFrame *out; > > >>>>> const AVPixFmtDescriptor *desc = > > >>>>> av_pix_fmt_desc_get(link->format); > > >>>>> + const AVPixFmtDescriptor *out_desc = > > >>>>> av_pix_fmt_desc_get(outlink->format); > > >>>>> char buf[32]; > > >>>>> int in_range; > > >>>>> > > >>>>> @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, > > >>>>> AVFrame > > >>>>> *in) > > >>>>> table, out_full, > > >>>>> brightness, contrast, > > >>>>> saturation); > > >>>>> > > >>>>> - out->color_range = out_full ? AVCOL_RANGE_JPEG : > > >>>>> AVCOL_RANGE_MPEG; > > >>>>> + // color_range describes YUV, it is undefined for RGB > > >>>>> + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && > > >>>>> out_desc->nb_components != 1) { > > >>>>> + out->color_range = AVCOL_RANGE_UNSPECIFIED; > > >>>>> + } else > > >>>>> + out->color_range = out_full ? AVCOL_RANGE_JPEG : > > >>>>> AVCOL_RANGE_MPEG; > > >>>>> } > > >>>>> > > >>>>> av_reduce(&out->sample_aspect_ratio.num, > > >>>>> &out->sample_aspect_ratio.den, > > >>>>> -- > > >>>>> 2.16.2 > > >>>>> > > >>>> > > >>>> This is not optimal, as full color_range should remain full when not > > >>>> changed. > > >>> > > >>> there is no range for rgb formats. The range is specific to YUV based > > >>> formats. > > >>> Thats, if iam guessing correctly what you meant. You did not really say > > >>> which case you meant here. So maybe there is an issue and i misunderstand > > >>> what you refer to > > >> > > >> Maybe not for swscale here but does exist otherwise. > > > > > > It has no meaning for RGB. There is no limited range RGB > > > also, the API defines it only for YUV. So if it had meaning for RGB its not defined > > > what meaning that would be. The ranges for luma and chroma differ so its not > > > natural or obvious how to extend it to RGB. > > > Iam also not aware of any specification that defines limited range RGB > > See HDMI, HD-SDI, CEA-861, pretty much anything related to sending RGB over wires in a non-PC context. > > > > (No comment on whether it is useful to include it, but dismissing limited range RGB as not a thing is probably not a good idea. I would kindof expect things like DeckLink to be using limited-range RGB everywhere, but I'm not familiar with the details there.) > > Is this used just over wires or also in software ? Yes, it can happen that you "need" to output limited RGB for consumer burning trash fire hardware. > aka should we update our enum to also cover this and > If yes then we also probably should add support for this > to swscale I tried to use it once and considered it a libswscale bug and reported it, but was overruled or something.
diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 9f45032e85..2f6fa4791d 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -407,6 +407,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) AVFilterLink *outlink = link->dst->outputs[0]; AVFrame *out; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); + const AVPixFmtDescriptor *out_desc = av_pix_fmt_desc_get(outlink->format); char buf[32]; int in_range; @@ -497,7 +498,11 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) table, out_full, brightness, contrast, saturation); - out->color_range = out_full ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; + // color_range describes YUV, it is undefined for RGB + if ((out_desc->flags & AV_PIX_FMT_FLAG_RGB) && out_desc->nb_components != 1) { + out->color_range = AVCOL_RANGE_UNSPECIFIED; + } else + out->color_range = out_full ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; } av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den,
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> --- libavfilter/vf_scale.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)