diff mbox series

[FFmpeg-devel,25/33] fftools/ffmpeg_filter: stop disregarding user-specified pixel format

Message ID 20230713105553.21052-25-anton@khirnov.net
State New
Headers show
Series [FFmpeg-devel,01/33] fftools/ffmpeg_mux_init: return errors from of_open() instead of aborting | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov July 13, 2023, 10:55 a.m. UTC
When the user explicitly specifies a pixel format that is not supported
by the encoder, ffmpeg CLI will currently use some heuristics to pick
another supported format. This is wrong and the correct action here is
to fail.

Surprisingly, a number of FATE tests are affected by this and actually
use a different pixel format than is specified in the makefiles.
---
 doc/ffmpeg.texi                               |  3 +-
 fftools/ffmpeg_filter.c                       | 35 +------------------
 tests/fate/fits.mak                           |  6 ++--
 tests/fate/lavf-video.mak                     |  2 +-
 tests/fate/vcodec.mak                         |  4 +--
 .../{fitsdec-gbrap16le => fitsdec-gbrap16be}  |  4 +--
 .../fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} |  4 +--
 tests/ref/lavf/gif                            |  2 +-
 8 files changed, 13 insertions(+), 47 deletions(-)
 rename tests/ref/fate/{fitsdec-gbrap16le => fitsdec-gbrap16be} (79%)
 rename tests/ref/fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} (79%)

Comments

Michael Niedermayer July 13, 2023, 11:11 p.m. UTC | #1
On Thu, Jul 13, 2023 at 12:55:45PM +0200, Anton Khirnov wrote:
> When the user explicitly specifies a pixel format that is not supported
> by the encoder, ffmpeg CLI will currently use some heuristics to pick
> another supported format. This is wrong and the correct action here is
> to fail.
> 
> Surprisingly, a number of FATE tests are affected by this and actually
> use a different pixel format than is specified in the makefiles.
> ---
>  doc/ffmpeg.texi                               |  3 +-
>  fftools/ffmpeg_filter.c                       | 35 +------------------
>  tests/fate/fits.mak                           |  6 ++--
>  tests/fate/lavf-video.mak                     |  2 +-
>  tests/fate/vcodec.mak                         |  4 +--
>  .../{fitsdec-gbrap16le => fitsdec-gbrap16be}  |  4 +--
>  .../fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} |  4 +--
>  tests/ref/lavf/gif                            |  2 +-
>  8 files changed, 13 insertions(+), 47 deletions(-)
>  rename tests/ref/fate/{fitsdec-gbrap16le => fitsdec-gbrap16be} (79%)
>  rename tests/ref/fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} (79%)
> 
> diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
> index 6769f8d305..08b11097b7 100644
> --- a/doc/ffmpeg.texi
> +++ b/doc/ffmpeg.texi
> @@ -1014,8 +1014,7 @@ Disable autoscale at your own risk.
>  @item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream})
>  Set pixel format. Use @code{-pix_fmts} to show all the supported
>  pixel formats.
> -If the selected pixel format can not be selected, ffmpeg will print a
> -warning and select the best pixel format supported by the encoder.
> +
>  If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error
>  if the requested pixel format can not be selected, and automatic conversions
>  inside filtergraphs are disabled.

The commit message makes this sound like a bugfix, while really this is
removing a documented feature.

It also breaks some scripts (fate is an example as it requires changes)

If the removial of that feature is intended, it should be argued somewhere
that this feature is never usefull.

To me as a lazy person it surely feels usefull to be able to ask for
both "exactly rgb" as well as something close to rgb (like bgr or gbrp)
without needing to know what each individual codec uses to return R,G,B

thx

[...]
Anton Khirnov July 14, 2023, 9:44 a.m. UTC | #2
Quoting Michael Niedermayer (2023-07-14 01:11:07)
> On Thu, Jul 13, 2023 at 12:55:45PM +0200, Anton Khirnov wrote:
> > When the user explicitly specifies a pixel format that is not supported
> > by the encoder, ffmpeg CLI will currently use some heuristics to pick
> > another supported format. This is wrong and the correct action here is
> > to fail.
> > 
> > Surprisingly, a number of FATE tests are affected by this and actually
> > use a different pixel format than is specified in the makefiles.
> > ---
> >  doc/ffmpeg.texi                               |  3 +-
> >  fftools/ffmpeg_filter.c                       | 35 +------------------
> >  tests/fate/fits.mak                           |  6 ++--
> >  tests/fate/lavf-video.mak                     |  2 +-
> >  tests/fate/vcodec.mak                         |  4 +--
> >  .../{fitsdec-gbrap16le => fitsdec-gbrap16be}  |  4 +--
> >  .../fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} |  4 +--
> >  tests/ref/lavf/gif                            |  2 +-
> >  8 files changed, 13 insertions(+), 47 deletions(-)
> >  rename tests/ref/fate/{fitsdec-gbrap16le => fitsdec-gbrap16be} (79%)
> >  rename tests/ref/fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} (79%)
> > 
> > diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
> > index 6769f8d305..08b11097b7 100644
> > --- a/doc/ffmpeg.texi
> > +++ b/doc/ffmpeg.texi
> > @@ -1014,8 +1014,7 @@ Disable autoscale at your own risk.
> >  @item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream})
> >  Set pixel format. Use @code{-pix_fmts} to show all the supported
> >  pixel formats.
> > -If the selected pixel format can not be selected, ffmpeg will print a
> > -warning and select the best pixel format supported by the encoder.
> > +
> >  If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error
> >  if the requested pixel format can not be selected, and automatic conversions
> >  inside filtergraphs are disabled.
> 
> The commit message makes this sound like a bugfix, while really this is
> removing a documented feature.

It is a bugfix in my eyes. When you explicitly tell a program to perform
a specific action, and the program just decides to do something else,
then that program is broken.

As far as I can tell, this "feature" was added by you in 89f86379797
with no explanation or documentation beyond 'fix regression with png'.
It was later documented in a largely-unrelated commit that added
something else.

I see no argument whatsoever for why we should have such a "smart"
selection for pixel formats, but nothing else. It goes entirely against
the way any other option works.

> It also breaks some scripts (fate is an example as it requires changes)

No, its removal reveals already broken FATE tests, as I see no
indication that those tests intended to use a different format than
indicated on the commandline. It seems far more likely that this
misfeature confused the tests' authors as to what format is actually
used. That is IMO yet another argument for removing this.

> If the removial of that feature is intended, it should be argued somewhere
> that this feature is never usefull.

https://xkcd.com/1172/

> To me as a lazy person it surely feels usefull to be able to ask for
> both "exactly rgb" as well as something close to rgb (like bgr or gbrp)
> without needing to know what each individual codec uses to return R,G,B

1) This code does not give you the ability to specify "something close to rgb".
   You specify a precise pixel format, and this code gives you
   something. That something might be what you asked for, or something
   close to it, or something completely unrelated.
   E.g.
     ffmpeg -i in.mkv -map 0:v -c:v libx264 -pix_fmt pal8 -t 1 out.mkv
   produces yuv444p. How is it close to pal8?
2) If you want syntax for fuzzy format specification, patches are
   welcome. But it should not interfere with specifying an exact format.
3) No other option in ffmpeg CLI works like this. If you specify
   something, you get that or an error.
Timo Rothenpieler July 14, 2023, 10:20 a.m. UTC | #3
On 14/07/2023 11:44, Anton Khirnov wrote:
> Quoting Michael Niedermayer (2023-07-14 01:11:07)
>> On Thu, Jul 13, 2023 at 12:55:45PM +0200, Anton Khirnov wrote:
>>> When the user explicitly specifies a pixel format that is not supported
>>> by the encoder, ffmpeg CLI will currently use some heuristics to pick
>>> another supported format. This is wrong and the correct action here is
>>> to fail.
>>>
>>> Surprisingly, a number of FATE tests are affected by this and actually
>>> use a different pixel format than is specified in the makefiles.
>>> ---
>>>   doc/ffmpeg.texi                               |  3 +-
>>>   fftools/ffmpeg_filter.c                       | 35 +------------------
>>>   tests/fate/fits.mak                           |  6 ++--
>>>   tests/fate/lavf-video.mak                     |  2 +-
>>>   tests/fate/vcodec.mak                         |  4 +--
>>>   .../{fitsdec-gbrap16le => fitsdec-gbrap16be}  |  4 +--
>>>   .../fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} |  4 +--
>>>   tests/ref/lavf/gif                            |  2 +-
>>>   8 files changed, 13 insertions(+), 47 deletions(-)
>>>   rename tests/ref/fate/{fitsdec-gbrap16le => fitsdec-gbrap16be} (79%)
>>>   rename tests/ref/fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} (79%)
>>>
>>> diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
>>> index 6769f8d305..08b11097b7 100644
>>> --- a/doc/ffmpeg.texi
>>> +++ b/doc/ffmpeg.texi
>>> @@ -1014,8 +1014,7 @@ Disable autoscale at your own risk.
>>>   @item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream})
>>>   Set pixel format. Use @code{-pix_fmts} to show all the supported
>>>   pixel formats.
>>> -If the selected pixel format can not be selected, ffmpeg will print a
>>> -warning and select the best pixel format supported by the encoder.
>>> +
>>>   If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error
>>>   if the requested pixel format can not be selected, and automatic conversions
>>>   inside filtergraphs are disabled.
>>
>> The commit message makes this sound like a bugfix, while really this is
>> removing a documented feature.
> 
> It is a bugfix in my eyes. When you explicitly tell a program to perform
> a specific action, and the program just decides to do something else,
> then that program is broken.
> 
> As far as I can tell, this "feature" was added by you in 89f86379797
> with no explanation or documentation beyond 'fix regression with png'.
> It was later documented in a largely-unrelated commit that added
> something else.
> 
> I see no argument whatsoever for why we should have such a "smart"
> selection for pixel formats, but nothing else. It goes entirely against
> the way any other option works.
> 
>> It also breaks some scripts (fate is an example as it requires changes)
> 
> No, its removal reveals already broken FATE tests, as I see no
> indication that those tests intended to use a different format than
> indicated on the commandline. It seems far more likely that this
> misfeature confused the tests' authors as to what format is actually
> used. That is IMO yet another argument for removing this.
> 
>> If the removial of that feature is intended, it should be argued somewhere
>> that this feature is never usefull.
> 
> https://xkcd.com/1172/
> 
>> To me as a lazy person it surely feels usefull to be able to ask for
>> both "exactly rgb" as well as something close to rgb (like bgr or gbrp)
>> without needing to know what each individual codec uses to return R,G,B
> 
> 1) This code does not give you the ability to specify "something close to rgb".
>     You specify a precise pixel format, and this code gives you
>     something. That something might be what you asked for, or something
>     close to it, or something completely unrelated.
>     E.g.
>       ffmpeg -i in.mkv -map 0:v -c:v libx264 -pix_fmt pal8 -t 1 out.mkv
>     produces yuv444p. How is it close to pal8?
> 2) If you want syntax for fuzzy format specification, patches are
>     welcome. But it should not interfere with specifying an exact format.
> 3) No other option in ffmpeg CLI works like this. If you specify
>     something, you get that or an error.

I completely agree. I didn't even realize this behaviour was a thing.
Getting a more or less random other pixel format than requested seems 
very surprising and undesireable.

However, this is unarguably an API break and can and will break existing 
scripts and applications.
So it should go through the usual deprecation cycle.
Maybe intensify the warning a bit, make it hang executing for a few 
seconds so people take notice.
Michael Niedermayer July 14, 2023, 3:47 p.m. UTC | #4
On Fri, Jul 14, 2023 at 11:44:07AM +0200, Anton Khirnov wrote:
> Quoting Michael Niedermayer (2023-07-14 01:11:07)
> > On Thu, Jul 13, 2023 at 12:55:45PM +0200, Anton Khirnov wrote:
> > > When the user explicitly specifies a pixel format that is not supported
> > > by the encoder, ffmpeg CLI will currently use some heuristics to pick
> > > another supported format. This is wrong and the correct action here is
> > > to fail.
> > > 
> > > Surprisingly, a number of FATE tests are affected by this and actually
> > > use a different pixel format than is specified in the makefiles.
> > > ---
> > >  doc/ffmpeg.texi                               |  3 +-
> > >  fftools/ffmpeg_filter.c                       | 35 +------------------
> > >  tests/fate/fits.mak                           |  6 ++--
> > >  tests/fate/lavf-video.mak                     |  2 +-
> > >  tests/fate/vcodec.mak                         |  4 +--
> > >  .../{fitsdec-gbrap16le => fitsdec-gbrap16be}  |  4 +--
> > >  .../fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} |  4 +--
> > >  tests/ref/lavf/gif                            |  2 +-
> > >  8 files changed, 13 insertions(+), 47 deletions(-)
> > >  rename tests/ref/fate/{fitsdec-gbrap16le => fitsdec-gbrap16be} (79%)
> > >  rename tests/ref/fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} (79%)
> > > 
> > > diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
> > > index 6769f8d305..08b11097b7 100644
> > > --- a/doc/ffmpeg.texi
> > > +++ b/doc/ffmpeg.texi
> > > @@ -1014,8 +1014,7 @@ Disable autoscale at your own risk.
> > >  @item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream})
> > >  Set pixel format. Use @code{-pix_fmts} to show all the supported
> > >  pixel formats.
> > > -If the selected pixel format can not be selected, ffmpeg will print a
> > > -warning and select the best pixel format supported by the encoder.
> > > +
> > >  If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error
> > >  if the requested pixel format can not be selected, and automatic conversions
> > >  inside filtergraphs are disabled.
> > 
> > The commit message makes this sound like a bugfix, while really this is
> > removing a documented feature.
> 
> It is a bugfix in my eyes. When you explicitly tell a program to perform
> a specific action, and the program just decides to do something else,
> then that program is broken.
> 
> As far as I can tell, this "feature" was added by you in 89f86379797
> with no explanation or documentation beyond 'fix regression with png'.
> It was later documented in a largely-unrelated commit that added
> something else.
> 
> I see no argument whatsoever for why we should have such a "smart"

As said previously,
The user cannot be expected to know if a implementation uses planar
or packed rgb, bgr or rgb.
This is not a inherent part of the file/stream/input in many cases

its not a problem for you because you are a FFmpeg developer and work
with this every day but it is a inconvenience for users


[...]

> > To me as a lazy person it surely feels usefull to be able to ask for
> > both "exactly rgb" as well as something close to rgb (like bgr or gbrp)
> > without needing to know what each individual codec uses to return R,G,B
> 

> 1) This code does not give you the ability to specify "something close to rgb".
>    You specify a precise pixel format, and this code gives you
>    something. That something might be what you asked for, or something
>    close to it, or something completely unrelated.
>    E.g.
>      ffmpeg -i in.mkv -map 0:v -c:v libx264 -pix_fmt pal8 -t 1 out.mkv
>    produces yuv444p. How is it close to pal8?

(it is close because it can represent pal8 with little loss i think but)

your patch fixes this and adjusts the threshold to not accept formats
that are too different ?
i agree that would be a bugfix and also it should be quite easy to do
as teh code already computes what the differences are and computes a score


> 2) If you want syntax for fuzzy format specification, patches are
>    welcome. But it should not interfere with specifying an exact format.

the code is there already
you found a case where it behaves unreasonable, so change the threshold
at which it accepts differences, you can even specify what differences
it accepts
theres also get_pix_fmt_score() that takes 2 pixel formats and gives
you a bitmask discribing their differences together with a numeric score

And once the threshold / mask is adjusted to accept what is considered
similar enough for the pixfmt ffmpeg command line use case.
You can move this to whatever syntax you prefer. You are the expert when
it comes to the ffmpeg command line.
Simply removing the code and calling for someone to add it back in
is a bit odd.


> 3) No other option in ffmpeg CLI works like this. If you specify
>    something, you get that or an error.

iam not sure thats true
i think width and height and even vs odd have their fuzzyness at places and
so probably does the aspect ratio. Its not failing if it has to be rounded
to a close value

you could try
./ffmpeg -i ~/videos/matrixbench_mpeg2.mpg  -aspect 512:511 test.m4v
there are only 8:8 bit so 512:511 cant be stored nothing fails you just
dont get 512:511

and iam pretty sure there are many more examples where "close" values
are taken silently

thx

[...]
Anton Khirnov July 14, 2023, 5:06 p.m. UTC | #5
Quoting Michael Niedermayer (2023-07-14 17:47:19)
> On Fri, Jul 14, 2023 at 11:44:07AM +0200, Anton Khirnov wrote:
> > Quoting Michael Niedermayer (2023-07-14 01:11:07)
> > > On Thu, Jul 13, 2023 at 12:55:45PM +0200, Anton Khirnov wrote:
> > > > When the user explicitly specifies a pixel format that is not supported
> > > > by the encoder, ffmpeg CLI will currently use some heuristics to pick
> > > > another supported format. This is wrong and the correct action here is
> > > > to fail.
> > > > 
> > > > Surprisingly, a number of FATE tests are affected by this and actually
> > > > use a different pixel format than is specified in the makefiles.
> > > > ---
> > > >  doc/ffmpeg.texi                               |  3 +-
> > > >  fftools/ffmpeg_filter.c                       | 35 +------------------
> > > >  tests/fate/fits.mak                           |  6 ++--
> > > >  tests/fate/lavf-video.mak                     |  2 +-
> > > >  tests/fate/vcodec.mak                         |  4 +--
> > > >  .../{fitsdec-gbrap16le => fitsdec-gbrap16be}  |  4 +--
> > > >  .../fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} |  4 +--
> > > >  tests/ref/lavf/gif                            |  2 +-
> > > >  8 files changed, 13 insertions(+), 47 deletions(-)
> > > >  rename tests/ref/fate/{fitsdec-gbrap16le => fitsdec-gbrap16be} (79%)
> > > >  rename tests/ref/fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} (79%)
> > > > 
> > > > diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
> > > > index 6769f8d305..08b11097b7 100644
> > > > --- a/doc/ffmpeg.texi
> > > > +++ b/doc/ffmpeg.texi
> > > > @@ -1014,8 +1014,7 @@ Disable autoscale at your own risk.
> > > >  @item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream})
> > > >  Set pixel format. Use @code{-pix_fmts} to show all the supported
> > > >  pixel formats.
> > > > -If the selected pixel format can not be selected, ffmpeg will print a
> > > > -warning and select the best pixel format supported by the encoder.
> > > > +
> > > >  If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error
> > > >  if the requested pixel format can not be selected, and automatic conversions
> > > >  inside filtergraphs are disabled.
> > > 
> > > The commit message makes this sound like a bugfix, while really this is
> > > removing a documented feature.
> > 
> > It is a bugfix in my eyes. When you explicitly tell a program to perform
> > a specific action, and the program just decides to do something else,
> > then that program is broken.
> > 
> > As far as I can tell, this "feature" was added by you in 89f86379797
> > with no explanation or documentation beyond 'fix regression with png'.
> > It was later documented in a largely-unrelated commit that added
> > something else.
> > 
> > I see no argument whatsoever for why we should have such a "smart"
> 
> As said previously,
> The user cannot be expected to know if a implementation uses planar
> or packed rgb, bgr or rgb.

Which is why
* libavfilter will by default convert to a format supported by the
  encoder
* libavcodec will now helpfully print a list of formats supported by the
  encoder if the caller gives it a wrong one

> This is not a inherent part of the file/stream/input in many cases
> its not a problem for you because you are a FFmpeg developer and work
> with this every day but it is a inconvenience for users

Should we then replace any failing commandline with something that will
not fail? Ignore any options with incorrect values? All in the name of
convenience? Maybe you should try web development.

Programs that try to second-guess user's explicit instructions are
broken by design. This "convenience" argument is entirely specious:
* users who do not know what they want get something that works by
  default
* users who specify a wrong format get a list of correct formats they
  can just pick from; that is as convenient as it gets for this kind of
  a program
* users who require yet more convenience and/or handholding can use a
  graphical program such as Handbrake; we should not try to be
  Handbrake, they are better at it than us

> > > To me as a lazy person it surely feels usefull to be able to ask for
> > > both "exactly rgb" as well as something close to rgb (like bgr or gbrp)
> > > without needing to know what each individual codec uses to return R,G,B
> > 
> 
> > 1) This code does not give you the ability to specify "something close to rgb".
> >    You specify a precise pixel format, and this code gives you
> >    something. That something might be what you asked for, or something
> >    close to it, or something completely unrelated.
> >    E.g.
> >      ffmpeg -i in.mkv -map 0:v -c:v libx264 -pix_fmt pal8 -t 1 out.mkv
> >    produces yuv444p. How is it close to pal8?
> 
> (it is close because it can represent pal8 with little loss i think but)

pal8 and yuv444p are close? I really wonder which pair of formats would
be not close for you then. If the set is non-empty, I'm sure I can craft
a commandline that produces one instead of the other.

> your patch fixes this and adjusts the threshold to not accept formats
> that are too different ?
> i agree that would be a bugfix and also it should be quite easy to do
> as teh code already computes what the differences are and computes a score
> 
> 
> > 2) If you want syntax for fuzzy format specification, patches are
> >    welcome. But it should not interfere with specifying an exact format.
> 
> the code is there already
> you found a case where it behaves unreasonable, so change the threshold
> at which it accepts differences, you can even specify what differences
> it accepts
> theres also get_pix_fmt_score() that takes 2 pixel formats and gives
> you a bitmask discribing their differences together with a numeric score
> 
> And once the threshold / mask is adjusted to accept what is considered
> similar enough for the pixfmt ffmpeg command line use case.
> You can move this to whatever syntax you prefer. You are the expert when
> it comes to the ffmpeg command line.
> Simply removing the code and calling for someone to add it back in
> is a bit odd.

Then my expert opinion is this - this code:
* is broken by design
* is actively harmful
* solves no actual problem
* adds unnecessary complexity
It should be removed in its entirety.

> > 3) No other option in ffmpeg CLI works like this. If you specify
> >    something, you get that or an error.
> 
> iam not sure thats true
> i think width and height and even vs odd have their fuzzyness at places and
> so probably does the aspect ratio. Its not failing if it has to be rounded
> to a close value
> 
> you could try
> ./ffmpeg -i ~/videos/matrixbench_mpeg2.mpg  -aspect 512:511 test.m4v
> there are only 8:8 bit so 512:511 cant be stored nothing fails you just
> dont get 512:511
> 
> and iam pretty sure there are many more examples where "close" values
> are taken silently

ffmpeg -i in.mkv -map 0:v -s 512x511 -c:v libx264 -f null -
[...]
[libx264 @ 0x55f8029a71c0] height not divisible by 2 (512x511)
[vost#0:0/libx264 @ 0x55f802a61840] Error while opening encoder - maybe incorrect parameters such as bit_rate, rate, width or height.

Besides, you keep talking about "close" when the code in question makes
no guarantee whatsoever that the result is in any way "close" (whatever
that might even mean).
Paul B Mahol July 15, 2023, 8:59 a.m. UTC | #6
On Fri, Jul 14, 2023 at 7:06 PM Anton Khirnov <anton@khirnov.net> wrote:

> Quoting Michael Niedermayer (2023-07-14 17:47:19)
> > On Fri, Jul 14, 2023 at 11:44:07AM +0200, Anton Khirnov wrote:
> > > Quoting Michael Niedermayer (2023-07-14 01:11:07)
> > > > On Thu, Jul 13, 2023 at 12:55:45PM +0200, Anton Khirnov wrote:
> > > > > When the user explicitly specifies a pixel format that is not
> supported
> > > > > by the encoder, ffmpeg CLI will currently use some heuristics to
> pick
> > > > > another supported format. This is wrong and the correct action
> here is
> > > > > to fail.
> > > > >
> > > > > Surprisingly, a number of FATE tests are affected by this and
> actually
> > > > > use a different pixel format than is specified in the makefiles.
> > > > > ---
> > > > >  doc/ffmpeg.texi                               |  3 +-
> > > > >  fftools/ffmpeg_filter.c                       | 35
> +------------------
> > > > >  tests/fate/fits.mak                           |  6 ++--
> > > > >  tests/fate/lavf-video.mak                     |  2 +-
> > > > >  tests/fate/vcodec.mak                         |  4 +--
> > > > >  .../{fitsdec-gbrap16le => fitsdec-gbrap16be}  |  4 +--
> > > > >  .../fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} |  4 +--
> > > > >  tests/ref/lavf/gif                            |  2 +-
> > > > >  8 files changed, 13 insertions(+), 47 deletions(-)
> > > > >  rename tests/ref/fate/{fitsdec-gbrap16le => fitsdec-gbrap16be}
> (79%)
> > > > >  rename tests/ref/fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} (79%)
> > > > >
> > > > > diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
> > > > > index 6769f8d305..08b11097b7 100644
> > > > > --- a/doc/ffmpeg.texi
> > > > > +++ b/doc/ffmpeg.texi
> > > > > @@ -1014,8 +1014,7 @@ Disable autoscale at your own risk.
> > > > >  @item -pix_fmt[:@var{stream_specifier}] @var{format}
> (@emph{input/output,per-stream})
> > > > >  Set pixel format. Use @code{-pix_fmts} to show all the supported
> > > > >  pixel formats.
> > > > > -If the selected pixel format can not be selected, ffmpeg will
> print a
> > > > > -warning and select the best pixel format supported by the encoder.
> > > > > +
> > > > >  If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with
> an error
> > > > >  if the requested pixel format can not be selected, and automatic
> conversions
> > > > >  inside filtergraphs are disabled.
> > > >
> > > > The commit message makes this sound like a bugfix, while really this
> is
> > > > removing a documented feature.
> > >
> > > It is a bugfix in my eyes. When you explicitly tell a program to
> perform
> > > a specific action, and the program just decides to do something else,
> > > then that program is broken.
> > >
> > > As far as I can tell, this "feature" was added by you in 89f86379797
> > > with no explanation or documentation beyond 'fix regression with png'.
> > > It was later documented in a largely-unrelated commit that added
> > > something else.
> > >
> > > I see no argument whatsoever for why we should have such a "smart"
> >
> > As said previously,
> > The user cannot be expected to know if a implementation uses planar
> > or packed rgb, bgr or rgb.
>
> Which is why
> * libavfilter will by default convert to a format supported by the
>   encoder
> * libavcodec will now helpfully print a list of formats supported by the
>   encoder if the caller gives it a wrong one
>
> > This is not a inherent part of the file/stream/input in many cases
> > its not a problem for you because you are a FFmpeg developer and work
> > with this every day but it is a inconvenience for users
>
> Should we then replace any failing commandline with something that will
> not fail? Ignore any options with incorrect values? All in the name of
> convenience? Maybe you should try web development.
>
> Programs that try to second-guess user's explicit instructions are
> broken by design. This "convenience" argument is entirely specious:
> * users who do not know what they want get something that works by
>   default
> * users who specify a wrong format get a list of correct formats they
>   can just pick from; that is as convenient as it gets for this kind of
>   a program
> * users who require yet more convenience and/or handholding can use a
>   graphical program such as Handbrake; we should not try to be
>   Handbrake, they are better at it than us
>
> > > > To me as a lazy person it surely feels usefull to be able to ask for
> > > > both "exactly rgb" as well as something close to rgb (like bgr or
> gbrp)
> > > > without needing to know what each individual codec uses to return
> R,G,B
> > >
> >
> > > 1) This code does not give you the ability to specify "something close
> to rgb".
> > >    You specify a precise pixel format, and this code gives you
> > >    something. That something might be what you asked for, or something
> > >    close to it, or something completely unrelated.
> > >    E.g.
> > >      ffmpeg -i in.mkv -map 0:v -c:v libx264 -pix_fmt pal8 -t 1 out.mkv
> > >    produces yuv444p. How is it close to pal8?
> >
> > (it is close because it can represent pal8 with little loss i think but)
>
> pal8 and yuv444p are close? I really wonder which pair of formats would
> be not close for you then. If the set is non-empty, I'm sure I can craft
> a commandline that produces one instead of the other.
>
> > your patch fixes this and adjusts the threshold to not accept formats
> > that are too different ?
> > i agree that would be a bugfix and also it should be quite easy to do
> > as teh code already computes what the differences are and computes a
> score
> >
> >
> > > 2) If you want syntax for fuzzy format specification, patches are
> > >    welcome. But it should not interfere with specifying an exact
> format.
> >
> > the code is there already
> > you found a case where it behaves unreasonable, so change the threshold
> > at which it accepts differences, you can even specify what differences
> > it accepts
> > theres also get_pix_fmt_score() that takes 2 pixel formats and gives
> > you a bitmask discribing their differences together with a numeric score
> >
> > And once the threshold / mask is adjusted to accept what is considered
> > similar enough for the pixfmt ffmpeg command line use case.
> > You can move this to whatever syntax you prefer. You are the expert when
> > it comes to the ffmpeg command line.
> > Simply removing the code and calling for someone to add it back in
> > is a bit odd.
>
> Then my expert opinion is this - this code:
> * is broken by design
> * is actively harmful
> * solves no actual problem
> * adds unnecessary complexity
> It should be removed in its entirety.
>
> > > 3) No other option in ffmpeg CLI works like this. If you specify
> > >    something, you get that or an error.
> >
> > iam not sure thats true
> > i think width and height and even vs odd have their fuzzyness at places
> and
> > so probably does the aspect ratio. Its not failing if it has to be
> rounded
> > to a close value
> >
> > you could try
> > ./ffmpeg -i ~/videos/matrixbench_mpeg2.mpg  -aspect 512:511 test.m4v
> > there are only 8:8 bit so 512:511 cant be stored nothing fails you just
> > dont get 512:511
> >
> > and iam pretty sure there are many more examples where "close" values
> > are taken silently
>
> ffmpeg -i in.mkv -map 0:v -s 512x511 -c:v libx264 -f null -
> [...]
> [libx264 @ 0x55f8029a71c0] height not divisible by 2 (512x511)
> [vost#0:0/libx264 @ 0x55f802a61840] Error while opening encoder - maybe
> incorrect parameters such as bit_rate, rate, width or height.
>
> Besides, you keep talking about "close" when the code in question makes
> no guarantee whatsoever that the result is in any way "close" (whatever
> that might even mean).
>

Agreed, this patch is good to go into repo.


>
> --
> Anton Khirnov
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
Michael Niedermayer July 15, 2023, 8:01 p.m. UTC | #7
Hi

On Fri, Jul 14, 2023 at 07:06:15PM +0200, Anton Khirnov wrote:
> Quoting Michael Niedermayer (2023-07-14 17:47:19)
> > On Fri, Jul 14, 2023 at 11:44:07AM +0200, Anton Khirnov wrote:
> > > Quoting Michael Niedermayer (2023-07-14 01:11:07)
> > > > On Thu, Jul 13, 2023 at 12:55:45PM +0200, Anton Khirnov wrote:
> > > > > When the user explicitly specifies a pixel format that is not supported
> > > > > by the encoder, ffmpeg CLI will currently use some heuristics to pick
> > > > > another supported format. This is wrong and the correct action here is
> > > > > to fail.
> > > > > 
> > > > > Surprisingly, a number of FATE tests are affected by this and actually
> > > > > use a different pixel format than is specified in the makefiles.
> > > > > ---
> > > > >  doc/ffmpeg.texi                               |  3 +-
> > > > >  fftools/ffmpeg_filter.c                       | 35 +------------------
> > > > >  tests/fate/fits.mak                           |  6 ++--
> > > > >  tests/fate/lavf-video.mak                     |  2 +-
> > > > >  tests/fate/vcodec.mak                         |  4 +--
> > > > >  .../{fitsdec-gbrap16le => fitsdec-gbrap16be}  |  4 +--
> > > > >  .../fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} |  4 +--
> > > > >  tests/ref/lavf/gif                            |  2 +-
> > > > >  8 files changed, 13 insertions(+), 47 deletions(-)
> > > > >  rename tests/ref/fate/{fitsdec-gbrap16le => fitsdec-gbrap16be} (79%)
> > > > >  rename tests/ref/fate/{fitsdec-gbrp16 => fitsdec-gbrp16be} (79%)
> > > > > 
> > > > > diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
> > > > > index 6769f8d305..08b11097b7 100644
> > > > > --- a/doc/ffmpeg.texi
> > > > > +++ b/doc/ffmpeg.texi
> > > > > @@ -1014,8 +1014,7 @@ Disable autoscale at your own risk.
> > > > >  @item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream})
> > > > >  Set pixel format. Use @code{-pix_fmts} to show all the supported
> > > > >  pixel formats.
> > > > > -If the selected pixel format can not be selected, ffmpeg will print a
> > > > > -warning and select the best pixel format supported by the encoder.
> > > > > +
> > > > >  If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error
> > > > >  if the requested pixel format can not be selected, and automatic conversions
> > > > >  inside filtergraphs are disabled.
> > > > 
> > > > The commit message makes this sound like a bugfix, while really this is
> > > > removing a documented feature.
> > > 
> > > It is a bugfix in my eyes. When you explicitly tell a program to perform
> > > a specific action, and the program just decides to do something else,
> > > then that program is broken.
> > > 
> > > As far as I can tell, this "feature" was added by you in 89f86379797
> > > with no explanation or documentation beyond 'fix regression with png'.
> > > It was later documented in a largely-unrelated commit that added
> > > something else.
> > > 
> > > I see no argument whatsoever for why we should have such a "smart"
> > 
> > As said previously,
> > The user cannot be expected to know if a implementation uses planar
> > or packed rgb, bgr or rgb.
> 
> Which is why
> * libavfilter will by default convert to a format supported by the
>   encoder

If the user uses -pix_fmt she likely doesnt want "any" format but has a
preferrance for some reason like 8bit or rgb for example


> * libavcodec will now helpfully print a list of formats supported by the
>   encoder if the caller gives it a wrong one

Thats good, but its a case per case adjustment.


> 
> > This is not a inherent part of the file/stream/input in many cases
> > its not a problem for you because you are a FFmpeg developer and work
> > with this every day but it is a inconvenience for users
> 
> Should we then replace any failing commandline with something that will
> not fail? Ignore any options with incorrect values? All in the name of
> convenience? Maybe you should try web development.

-pix_fmt is not "any command line"
https://en.wikipedia.org/wiki/Straw_man


> 
> Programs that try to second-guess user's explicit instructions are
> broken by design.

Maybe but the pix_fmt has 2 syntaxes one for explicit instructions
and one for a close one. Your patch modifies the "pick a close one" path


> This "convenience" argument is entirely specious:
> * users who do not know what they want get something that works by
>   default

Thats not true, 16bit yuv might not work for example for the users case


> * users who specify a wrong format get a list of correct formats they
>   can just pick from; that is as convenient as it gets for this kind of
>   a program

it works probably for most cases but its an extra step for the user
and a change in command line syntax


> * users who require yet more convenience and/or handholding can use a
>   graphical program such as Handbrake; we should not try to be
>   Handbrake, they are better at it than us

I dont understand what you are trying to say here
"require yet more convenience" is a very strange wording
I dont require convenience, i can use intels documentation, teh ELF
docs and a hex editor. But I instead use a compiler. Similarly
I surely can manually tyoe out the number of pixels for each frame
used but instead i expect ffmpeg to do that for me from the width and
height. Why should i not be able to tell FFmpeg to use a 8bit RGB format?
and instead receive a error message with a list of which format the
implementation supports than search the RGB variant be that RGB, BGR or GBRP
and write that back to ffmpeg in a 2nd call ?

This is not related to GUI vs command line interface. a GUI can show
that list too.


> 
> > > > To me as a lazy person it surely feels usefull to be able to ask for
> > > > both "exactly rgb" as well as something close to rgb (like bgr or gbrp)
> > > > without needing to know what each individual codec uses to return R,G,B
> > > 
> > 
> > > 1) This code does not give you the ability to specify "something close to rgb".
> > >    You specify a precise pixel format, and this code gives you
> > >    something. That something might be what you asked for, or something
> > >    close to it, or something completely unrelated.
> > >    E.g.
> > >      ffmpeg -i in.mkv -map 0:v -c:v libx264 -pix_fmt pal8 -t 1 out.mkv
> > >    produces yuv444p. How is it close to pal8?
> > 
> > (it is close because it can represent pal8 with little loss i think but)
> 
> pal8 and yuv444p are close? I really wonder which pair of formats would
> be not close for you then. If the set is non-empty, I'm sure I can craft
> a commandline that produces one instead of the other.

You are misunderstanding what i meant
pal8 -> yuv444p relatively little loss of information
yuv444p -> pal8 not "close" because substantial loss of information


[...]
> > > 3) No other option in ffmpeg CLI works like this. If you specify
> > >    something, you get that or an error.
> > 
> > iam not sure thats true
> > i think width and height and even vs odd have their fuzzyness at places and
> > so probably does the aspect ratio. Its not failing if it has to be rounded
> > to a close value
> > 
> > you could try
> > ./ffmpeg -i ~/videos/matrixbench_mpeg2.mpg  -aspect 512:511 test.m4v
> > there are only 8:8 bit so 512:511 cant be stored nothing fails you just
> > dont get 512:511
> > 
> > and iam pretty sure there are many more examples where "close" values
> > are taken silently
> 
> ffmpeg -i in.mkv -map 0:v -s 512x511 -c:v libx264 -f null -
> [...]
> [libx264 @ 0x55f8029a71c0] height not divisible by 2 (512x511)
> [vost#0:0/libx264 @ 0x55f802a61840] Error while opening encoder - maybe incorrect parameters such as bit_rate, rate, width or height.

maybe you want to remove "force_divisible_by" too and let the user
specify the value explicitly


> 
> Besides, you keep talking about "close" when the code in question makes
> no guarantee whatsoever that the result is in any way "close" (whatever
> that might even mean).

The code picks the "closest" format.
That can also be seen in your example of pal8 ->yuv444p. Where the encoder
supports nothing closer.

Noone seems to have been bothered before by the fact that the code makes
such choices if its fed by an impossible target.
As said previously, you can just adjust the value at which it hard fails

Do you want me to look at how that can be done and send a patch doing that ?

thx

[...]
diff mbox series

Patch

diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
index 6769f8d305..08b11097b7 100644
--- a/doc/ffmpeg.texi
+++ b/doc/ffmpeg.texi
@@ -1014,8 +1014,7 @@  Disable autoscale at your own risk.
 @item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream})
 Set pixel format. Use @code{-pix_fmts} to show all the supported
 pixel formats.
-If the selected pixel format can not be selected, ffmpeg will print a
-warning and select the best pixel format supported by the encoder.
+
 If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error
 if the requested pixel format can not be selected, and automatic conversions
 inside filtergraphs are disabled.
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index caf85194c5..0625a9bc92 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -277,38 +277,6 @@  static const enum AVPixelFormat *get_compliance_normal_pix_fmts(const AVCodec *c
     }
 }
 
-static enum AVPixelFormat
-choose_pixel_fmt(const AVCodec *codec, enum AVPixelFormat target,
-                 int strict_std_compliance)
-{
-    if (codec && codec->pix_fmts) {
-        const enum AVPixelFormat *p = codec->pix_fmts;
-        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(target);
-        //FIXME: This should check for AV_PIX_FMT_FLAG_ALPHA after PAL8 pixel format without alpha is implemented
-        int has_alpha = desc ? desc->nb_components % 2 == 0 : 0;
-        enum AVPixelFormat best= AV_PIX_FMT_NONE;
-
-        if (strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL) {
-            p = get_compliance_normal_pix_fmts(codec, p);
-        }
-        for (; *p != AV_PIX_FMT_NONE; p++) {
-            best = av_find_best_pix_fmt_of_2(best, *p, target, has_alpha, NULL);
-            if (*p == target)
-                break;
-        }
-        if (*p == AV_PIX_FMT_NONE) {
-            if (target != AV_PIX_FMT_NONE)
-                av_log(NULL, AV_LOG_WARNING,
-                       "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
-                       av_get_pix_fmt_name(target),
-                       codec->name,
-                       av_get_pix_fmt_name(best));
-            return best;
-        }
-    }
-    return target;
-}
-
 /* May return NULL (no pixel format found), a static string or a string
  * backed by the bprint. Nothing has been written to the AVBPrint in case
  * NULL is returned. The AVBPrint provided should be clean. */
@@ -327,8 +295,7 @@  static const char *choose_pix_fmts(OutputFilter *ofilter, AVBPrint *bprint)
         return av_get_pix_fmt_name(ost->enc_ctx->pix_fmt);
     }
     if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
-        return av_get_pix_fmt_name(choose_pixel_fmt(enc->codec, enc->pix_fmt,
-                                                    ost->enc_ctx->strict_std_compliance));
+        return av_get_pix_fmt_name(enc->pix_fmt);
     } else if (enc->codec->pix_fmts) {
         const enum AVPixelFormat *p;
 
diff --git a/tests/fate/fits.mak b/tests/fate/fits.mak
index b9e99d97ee..d85946bc1a 100644
--- a/tests/fate/fits.mak
+++ b/tests/fate/fits.mak
@@ -8,8 +8,8 @@  tests/data/fits-multi.fits: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
 # TODO: Use an actual 64bit input file and fix the gbrp16 test on big-endian
 fits-png-map-gray      := gray8
 fits-png-map-gbrp      := rgb24
-fits-png-map-gbrp16    := rgb48
-fits-png-map-gbrap16le := rgba64
+fits-png-map-gbrp16be  := rgb48
+fits-png-map-gbrap16be := rgba64
 
 FATE_FITS_DEC-$(call FRAMECRC, FITS, FITS, SCALE_FILTER) += fate-fitsdec-ext_data_min_max
 fate-fitsdec-ext_data_min_max: CMD = framecrc -i $(TARGET_SAMPLES)/fits/x0cj010ct_d0h.fit -pix_fmt gray16le -vf scale
@@ -30,7 +30,7 @@  fate-fitsdec-multi: CMD = framecrc -i $(TARGET_PATH)/tests/data/fits-multi.fits
 fate-fitsdec%: PIXFMT = $(word 3, $(subst -, ,$(@)))
 fate-fitsdec%: CMD = transcode image2 $(TARGET_SAMPLES)/png1/lena-$(fits-png-map-$(PIXFMT)).png fits "-vf scale -pix_fmt $(PIXFMT)"
 
-FATE_FITS_DEC_PIXFMT = gray gbrp gbrp16 gbrap16le
+FATE_FITS_DEC_PIXFMT = gray gbrp gbrp16be gbrap16be
 FATE_FITS_DEC-$(call TRANSCODE, FITS, FITS, IMAGE2_DEMUXER PNG_DECODER SCALE_FILTER) += $(FATE_FITS_DEC_PIXFMT:%=fate-fitsdec-%)
 
 FATE_FITS += $(FATE_FITS_DEC-yes)
diff --git a/tests/fate/lavf-video.mak b/tests/fate/lavf-video.mak
index e73f8f203b..da3b114bc8 100644
--- a/tests/fate/lavf-video.mak
+++ b/tests/fate/lavf-video.mak
@@ -27,7 +27,7 @@  fate-lavf-gbrp.fits: CMD = lavf_video "-pix_fmt gbrp"
 fate-lavf-gbrap.fits: CMD = lavf_video "-pix_fmt gbrap"
 fate-lavf-gbrp16be.fits: CMD = lavf_video "-pix_fmt gbrp16be"
 fate-lavf-gbrap16be.fits: CMD = lavf_video "-pix_fmt gbrap16be"
-fate-lavf-gif: CMD = lavf_video "-pix_fmt rgb24"
+fate-lavf-gif: CMD = lavf_video "-pix_fmt rgb8"
 
 FATE_AVCONV += $(FATE_LAVF_VIDEO)
 fate-lavf-video fate-lavf: $(FATE_LAVF_VIDEO)
diff --git a/tests/fate/vcodec.mak b/tests/fate/vcodec.mak
index 2839e54de8..e32d28c556 100644
--- a/tests/fate/vcodec.mak
+++ b/tests/fate/vcodec.mak
@@ -210,9 +210,9 @@  fate-vsynth%-h263p:              ENCOPTS = -qscale 2 -flags +aic -umv 1 -aiv 1 -
 FATE_VCODEC_SCALE-$(call ENCDEC, HUFFYUV, AVI) += huffyuv huffyuvbgr24 huffyuvbgra
 fate-vsynth%-huffyuv:            ENCOPTS = -c:v huffyuv -pix_fmt yuv422p -sws_flags neighbor
 fate-vsynth%-huffyuv:            DECOPTS = -sws_flags neighbor
-fate-vsynth%-huffyuvbgr24:       ENCOPTS = -c:v huffyuv -pix_fmt bgr24 -sws_flags neighbor
+fate-vsynth%-huffyuvbgr24:       ENCOPTS = -c:v huffyuv -pix_fmt rgb24 -sws_flags neighbor
 fate-vsynth%-huffyuvbgr24:       DECOPTS = -sws_flags neighbor
-fate-vsynth%-huffyuvbgra:        ENCOPTS = -c:v huffyuv -pix_fmt bgr32 -sws_flags neighbor
+fate-vsynth%-huffyuvbgra:        ENCOPTS = -c:v huffyuv -pix_fmt rgb32 -sws_flags neighbor
 fate-vsynth%-huffyuvbgra:        DECOPTS = -sws_flags neighbor
 
 FATE_VCODEC_SCALE-$(call ENCDEC, JPEGLS, AVI) += jpegls
diff --git a/tests/ref/fate/fitsdec-gbrap16le b/tests/ref/fate/fitsdec-gbrap16be
similarity index 79%
rename from tests/ref/fate/fitsdec-gbrap16le
rename to tests/ref/fate/fitsdec-gbrap16be
index 53ef980b13..1174a0f1d8 100644
--- a/tests/ref/fate/fitsdec-gbrap16le
+++ b/tests/ref/fate/fitsdec-gbrap16be
@@ -1,5 +1,5 @@ 
-64526d8da12d1fa07ceea5725647076f *tests/data/fate/fitsdec-gbrap16le.fits
-135360 tests/data/fate/fitsdec-gbrap16le.fits
+64526d8da12d1fa07ceea5725647076f *tests/data/fate/fitsdec-gbrap16be.fits
+135360 tests/data/fate/fitsdec-gbrap16be.fits
 #tb 0: 1/1
 #media_type 0: video
 #codec_id 0: rawvideo
diff --git a/tests/ref/fate/fitsdec-gbrp16 b/tests/ref/fate/fitsdec-gbrp16be
similarity index 79%
rename from tests/ref/fate/fitsdec-gbrp16
rename to tests/ref/fate/fitsdec-gbrp16be
index 9250690e9b..ff4ca9e65c 100644
--- a/tests/ref/fate/fitsdec-gbrp16
+++ b/tests/ref/fate/fitsdec-gbrp16be
@@ -1,5 +1,5 @@ 
-2078208c93ba417d3fe150ba42bf5a30 *tests/data/fate/fitsdec-gbrp16.fits
-103680 tests/data/fate/fitsdec-gbrp16.fits
+2078208c93ba417d3fe150ba42bf5a30 *tests/data/fate/fitsdec-gbrp16be.fits
+103680 tests/data/fate/fitsdec-gbrp16be.fits
 #tb 0: 1/1
 #media_type 0: video
 #codec_id 0: rawvideo
diff --git a/tests/ref/lavf/gif b/tests/ref/lavf/gif
index fc94b9df3d..7f353df286 100644
--- a/tests/ref/lavf/gif
+++ b/tests/ref/lavf/gif
@@ -1,3 +1,3 @@ 
 e35f5ea283bbcb249818e0078ec72664 *tests/data/lavf/lavf.gif
 2011766 tests/data/lavf/lavf.gif
-tests/data/lavf/lavf.gif CRC=0x2429faff
+tests/data/lavf/lavf.gif CRC=0x37f4d323