diff mbox

[FFmpeg-devel] FFV1: make RGB48 support as non-experimental

Message ID 1c54159a-1309-2d12-ec89-e6f5d35c141e@mediaarea.net
State Superseded
Headers show

Commit Message

Jerome Martinez Jan. 5, 2018, 9:26 p.m. UTC
On 05/01/2018 16:14, Tobias Rapp wrote:
> On 05.01.2018 11:18, Jerome Martinez wrote:
>> 0001-FFV1-make-RGB48-support-as-non-experimental.patch
>>
>> From cd1bfe68a1a809700f25e593ac21ca3876d265ad Mon Sep 17 00:00:00 2001
>> From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome@mediaarea.net>
>> Date: Fri, 5 Jan 2018 11:09:01 +0100
>> Subject: [PATCH] FFV1: make RGB48 support as non-experimental
>
> make => mark

I reused a commit text from history, both words words were in it.
Anyway, attached is the updated .patch with the suggested subject line.

>
> BTW: common subject line format would be something like 
> "avcodec/ffv1enc: mark RGB48 support as non-experimental"
From 303f63fb7e6172fdb7de66da1f8a4006b79a535f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome@mediaarea.net>
Date: Fri, 5 Jan 2018 11:09:01 +0100
Subject: [PATCH] avcodec/ffv1enc: mark RGB48 support as non-experimental

Resulting bitstream was tested with a conformance checker
using the last draft of FFV1 specifications.
---
 libavcodec/ffv1enc.c | 4 ----
 1 file changed, 4 deletions(-)

Comments

Michael Niedermayer Jan. 6, 2018, 1:05 a.m. UTC | #1
On Fri, Jan 05, 2018 at 10:26:42PM +0100, Jerome Martinez wrote:
> On 05/01/2018 16:14, Tobias Rapp wrote:
> >On 05.01.2018 11:18, Jerome Martinez wrote:
> >>0001-FFV1-make-RGB48-support-as-non-experimental.patch
> >>
> >>From cd1bfe68a1a809700f25e593ac21ca3876d265ad Mon Sep 17 00:00:00 2001
> >>From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome@mediaarea.net>
> >>Date: Fri, 5 Jan 2018 11:09:01 +0100
> >>Subject: [PATCH] FFV1: make RGB48 support as non-experimental
> >
> >make => mark
> 
> I reused a commit text from history, both words words were in it.
> Anyway, attached is the updated .patch with the suggested subject line.



> 
> >
> >BTW: common subject line format would be something like "avcodec/ffv1enc:
> >mark RGB48 support as non-experimental"
> 

>  ffv1enc.c |    4 ----
>  1 file changed, 4 deletions(-)
> acfc60c913b311b148f2eeef2d2d6ea9e37afcf7  0001-avcodec-ffv1enc-mark-RGB48-support-as-non-experiment.patch
> From 303f63fb7e6172fdb7de66da1f8a4006b79a535f Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome@mediaarea.net>
> Date: Fri, 5 Jan 2018 11:09:01 +0100
> Subject: [PATCH] avcodec/ffv1enc: mark RGB48 support as non-experimental
> 
> Resulting bitstream was tested with a conformance checker
> using the last draft of FFV1 specifications.

But has the way this is stored been optimized ?

Once its marked as non exerimental all future decoders must support the exact
way. It can no longer then be changed, so we need to be really sure the design
is optimal first.
Are we ?
who has checked alternatives? what where the reasons why the alternatives
were not choosen?
for example consider get_context(), what it does with >8bit may or may not
be optimal
iam interrested to work on that in fact, ive a quite long and growing list
of other volunteer jobs to do though ...


[...]
Jerome Martinez Jan. 6, 2018, 3:54 p.m. UTC | #2
On 06/01/2018 02:05, Michael Niedermayer wrote:
>
>>   ffv1enc.c |    4 ----
>>   1 file changed, 4 deletions(-)
>> acfc60c913b311b148f2eeef2d2d6ea9e37afcf7  0001-avcodec-ffv1enc-mark-RGB48-support-as-non-experiment.patch
>>  From 303f63fb7e6172fdb7de66da1f8a4006b79a535f Mon Sep 17 00:00:00 2001
>> From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome@mediaarea.net>
>> Date: Fri, 5 Jan 2018 11:09:01 +0100
>> Subject: [PATCH] avcodec/ffv1enc: mark RGB48 support as non-experimental
>>
>> Resulting bitstream was tested with a conformance checker
>> using the last draft of FFV1 specifications.
> But has the way this is stored been optimized ?
>
> Once its marked as non exerimental all future decoders must support the exact
> way.

Although this is considered experimental in the encoder, the 
implementation adheres to the description in the specification. The 
bitstream specification does not provide a bitdepth limit so with the 
current draft of the specification, another FFV1 encoder could already 
encode 16-bit (and more) content. The work on the specification has been 
careful to not break compatibility with former drafts and at this point 
the FFV1 bitstream specification for versions 0, 1, and 3 should be 
considered already non-experimental for all bit depths. All current 
decoders should already support the exact way it is currently specified.

To make a change in the specification at this point would have cascading 
consequences as we’d have to retract the part of the specification which 
states that micro_version 4 of version 3 is the first stable variant. 
Worse, it is impossible to indicate a bitstream change in FFV1 version 
1, which permits RGB 16-bit content too, so it would be difficult for a 
decoder to detect a bitstream not conforming to the bitstream created by 
the current version of FFmpeg encoder.



>   It can no longer then be changed, so we need to be really sure the design
> is optimal first.
> Are we ?
> who has checked alternatives? what where the reasons why the alternatives
> were not choosen?
> for example consider get_context(), what it does with >8bit may or may not
> be optimal
> iam interrested to work on that in fact, ive a quite long and growing list
> of other volunteer jobs to do though ...

bitdepths >8bit have been well-used for years since many of them have 
long been marked as non-experimental (for instance 10bit is frequently 
used with lossless encoding of broadcast media and video from analog 
tape sources). In my opinion get_context() is specified for all 
bitdpeths and non-experimental for FFV1 versions 0, 1, and 3 by the 
specification work and it should not be changed in these versions.

For the encoder there may still be an opportunity to optimize while 
continuing to conform to the FFV1 versions 0, 1, and 3 bitstream 
specification, even if the encoder marks RGB48 as non-experimental. 
Additionally FFV1 version 4 or later could consider further optimization 
requesting a change in the FFV1 bitstream as version 4 has no stable 
micro_version and the entire version is in an experimental status.
Michael Niedermayer Jan. 6, 2018, 10:21 p.m. UTC | #3
On Sat, Jan 06, 2018 at 04:54:18PM +0100, Jerome Martinez wrote:
> On 06/01/2018 02:05, Michael Niedermayer wrote:
> >
> >>  ffv1enc.c |    4 ----
> >>  1 file changed, 4 deletions(-)
> >>acfc60c913b311b148f2eeef2d2d6ea9e37afcf7  0001-avcodec-ffv1enc-mark-RGB48-support-as-non-experiment.patch
> >> From 303f63fb7e6172fdb7de66da1f8a4006b79a535f Mon Sep 17 00:00:00 2001
> >>From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome@mediaarea.net>
> >>Date: Fri, 5 Jan 2018 11:09:01 +0100
> >>Subject: [PATCH] avcodec/ffv1enc: mark RGB48 support as non-experimental
> >>
> >>Resulting bitstream was tested with a conformance checker
> >>using the last draft of FFV1 specifications.
> >But has the way this is stored been optimized ?
> >
> >Once its marked as non exerimental all future decoders must support the exact
> >way.
> 
> Although this is considered experimental in the encoder, the implementation
> adheres to the description in the specification. The bitstream specification
> does not provide a bitdepth limit so with the current draft of the
> specification, another FFV1 encoder could already encode 16-bit (and more)
> content. The work on the specification has been careful to not break
> compatibility with former drafts and at this point the FFV1 bitstream
> specification for versions 0, 1, and 3 should be considered already
> non-experimental for all bit depths. All current decoders should already
> support the exact way it is currently specified.
> 
> To make a change in the specification at this point would have cascading
> consequences as we’d have to retract the part of the specification which
> states that micro_version 4 of version 3 is the first stable variant. Worse,
> it is impossible to indicate a bitstream change in FFV1 version 1, which
> permits RGB 16-bit content too, so it would be difficult for a decoder to
> detect a bitstream not conforming to the bitstream created by the current
> version of FFmpeg encoder.

Are you not making this look alot more complex than it is ?
Or maybe we talk about slightly different things here

with the next version we can introduce any method of storing 16bit or 9-15 bit
and we certainly do not support in the implementation all possible bit depths

From what i remember I had always wanted to improve the way that 
more than 8bit is handled, not just 16. Although 16 is a bit special

Consider this:
If we improve get_context() in the next version for >8bit
we still have to support 9-15 bit with the old definition 
if we now declare 16bit non experimental then we also must support that with
an old get_context() in the decoder.
the 16bit path is seperate from the lower bit depth. So this is an Additional
codepath that we have to carry in the future

isnt it smarter now that if we want to improve get_context() that we
dont now extend what can be generated with the current get_context ?

or are such current get_context() style files already widespread ?
if so then its probably best to accept it and keep supporting it


> 
> 
> 
> >  It can no longer then be changed, so we need to be really sure the design
> >is optimal first.
> >Are we ?
> >who has checked alternatives? what where the reasons why the alternatives
> >were not choosen?
> >for example consider get_context(), what it does with >8bit may or may not
> >be optimal
> >iam interrested to work on that in fact, ive a quite long and growing list
> >of other volunteer jobs to do though ...
> 
> bitdepths >8bit have been well-used for years since many of them have long
> been marked as non-experimental (for instance 10bit is frequently used with
> lossless encoding of broadcast media and video from analog tape sources). In
> my opinion get_context() is specified for all bitdpeths and non-experimental
> for FFV1 versions 0, 1, and 3 by the specification work and it should not be
> changed in these versions.

what get_context does was designed for 8bit, it should still be good enough
for 10bit and maybe 12 but as the bit depth gets larger i suspect get_context
becomes less optimal and there is more potential to improve compression
by changing it.


> 
> For the encoder there may still be an opportunity to optimize while
> continuing to conform to the FFV1 versions 0, 1, and 3 bitstream
> specification, even if the encoder marks RGB48 as non-experimental.
> Additionally FFV1 version 4 or later could consider further optimization
> requesting a change in the FFV1 bitstream as version 4 has no stable
> micro_version and the entire version is in an experimental status.
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Jerome Martinez Jan. 7, 2018, 5:39 p.m. UTC | #4
On 06/01/2018 23:21, Michael Niedermayer wrote:
> On Sat, Jan 06, 2018 at 04:54:18PM +0100, Jerome Martinez wrote:
>> On 06/01/2018 02:05, Michael Niedermayer wrote:
>>>>   ffv1enc.c |    4 ----
>>>>   1 file changed, 4 deletions(-)
>>>> acfc60c913b311b148f2eeef2d2d6ea9e37afcf7  0001-avcodec-ffv1enc-mark-RGB48-support-as-non-experiment.patch
>>>>  From 303f63fb7e6172fdb7de66da1f8a4006b79a535f Mon Sep 17 00:00:00 2001
>>>> From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome@mediaarea.net>
>>>> Date: Fri, 5 Jan 2018 11:09:01 +0100
>>>> Subject: [PATCH] avcodec/ffv1enc: mark RGB48 support as non-experimental
>>>>
>>>> Resulting bitstream was tested with a conformance checker
>>>> using the last draft of FFV1 specifications.
>>> But has the way this is stored been optimized ?
>>>
>>> Once its marked as non exerimental all future decoders must support the exact
>>> way.
>> Although this is considered experimental in the encoder, the implementation
>> adheres to the description in the specification. The bitstream specification
>> does not provide a bitdepth limit so with the current draft of the
>> specification, another FFV1 encoder could already encode 16-bit (and more)
>> content. The work on the specification has been careful to not break
>> compatibility with former drafts and at this point the FFV1 bitstream
>> specification for versions 0, 1, and 3 should be considered already
>> non-experimental for all bit depths. All current decoders should already
>> support the exact way it is currently specified.
>>
>> To make a change in the specification at this point would have cascading
>> consequences as we’d have to retract the part of the specification which
>> states that micro_version 4 of version 3 is the first stable variant. Worse,
>> it is impossible to indicate a bitstream change in FFV1 version 1, which
>> permits RGB 16-bit content too, so it would be difficult for a decoder to
>> detect a bitstream not conforming to the bitstream created by the current
>> version of FFmpeg encoder.
> Are you not making this look alot more complex than it is ?
> Or maybe we talk about slightly different things here
>
> with the next version we can introduce any method of storing 16bit or 9-15 bit
> and we certainly do not support in the implementation all possible bit depths
>
>  From what i remember I had always wanted to improve the way that
> more than 8bit is handled, not just 16. Although 16 is a bit special
>
> Consider this:
> If we improve get_context() in the next version for >8bit
> we still have to support 9-15 bit with the old definition
> if we now declare 16bit non experimental then we also must support that with
> an old get_context() in the decoder.
> the 16bit path is seperate from the lower bit depth. So this is an Additional
> codepath that we have to carry in the future
>
> isnt it smarter now that if we want to improve get_context() that we
> dont now extend what can be generated with the current get_context ?
>
> or are such current get_context() style files already widespread ?
> if so then its probably best to accept it and keep supporting it

I am lost.
Looks like we talk about 2 different subjects: FFV1 bitstream 
specifications and FFmpeg implementation.
Let separate subjects:

FFV1 bitstream specifications:
Since at least 2012 [1] get_context (in the bitstream) is defined and 
flagged as stable for **all** bit depths for versions 0, 1, 3.
It is still the case today [2].
There was a consensus on discussing about FFV1 bitstream on CELLAR 
mailing list
There was a consensus for not changing the bitstream for version 0, 1, 3 
so we can standardize it ASAP without breaking current implementations 
(reason we document bugs in the main encoder, but the idea is not to 
accept more changes)
If the FFV1 bitstream for version 0, 1, or 3 must be changed in current 
stable version, it would be a major break in the consensus and it should 
be discussed on CELLAR list (in copy as they are concerned), but I doubt 
the consensus would be for breaking the bitstream compatibility as the 
discussion from day 0 on CELLAR is to document current bitstream without 
changing it for versions 0, 1, 3. The fact that there was no (publicly 
available) RGB48 encoder in the wild is not an excuse for breaking the 
compatibility with current draft of specifications. Same if someone 
decides to do an encoder for e.g. RGB3000.
It is possible to change the bitstream with version 4 (experimental 
version), and it is a good place for changing get_context for 16-bit 
content (whatever is the color space, BTW).

FFmpeg implementation:
FFV1 YCbCr 16-bit is already flagged as non experimental, so there is 
already some non experimental 16-bit support in FFmpeg FFV1 encoder. 
16-bit is not new and for RGB48 the actual encoding after RGB to YCbCr 
transformation is just 1 bit more (17-bit).
FFmpeg experimental flag is for the status of the encoder, not for the 
status of the bitstream (the bitstream for versions 0, 1, 3 is already 
considered stable for RGB48 and others)
FFV1 RGB48 support in FFmpeg is conform to FFV1 bitstream specifications.
Optimizing FFmpeg for better compression of FFV1 RGB48 as specified in 
spec is not blocked after this change.
The only reason for keeping the experimental flag for RGB48 support is 
if the resulting file does not comply to the FFV1 specification, and 
this is not the case (tested with a conformance checker complying to 
FFV1 specifications).

As a result, the comment about get_contet for RGB48 is blocking for 
removing experimental status of version 4, but the suggested patch does 
not touch on version 4.

[1] 
https://github.com/FFmpeg/FFV1/blob/cbb560873e54bfe2d2042e898a210fe2abd079e0/ffv1.lyx#L659
[2] 
https://github.com/FFmpeg/FFV1/blob/fdc65b73282633cc8867c185e83a6d21e5c65f3f/ffv1.md#context 

[3] 
https://github.com/FFmpeg/FFV1/blob/fdc65b73282633cc8867c185e83a6d21e5c65f3f/ffv1.md#micro_version
Michael Niedermayer Jan. 7, 2018, 7:08 p.m. UTC | #5
Hi

On Sun, Jan 07, 2018 at 06:39:34PM +0100, Jerome Martinez wrote:
> On 06/01/2018 23:21, Michael Niedermayer wrote:
> >On Sat, Jan 06, 2018 at 04:54:18PM +0100, Jerome Martinez wrote:
> >>On 06/01/2018 02:05, Michael Niedermayer wrote:
> >>>>  ffv1enc.c |    4 ----
> >>>>  1 file changed, 4 deletions(-)
> >>>>acfc60c913b311b148f2eeef2d2d6ea9e37afcf7  0001-avcodec-ffv1enc-mark-RGB48-support-as-non-experiment.patch
> >>>> From 303f63fb7e6172fdb7de66da1f8a4006b79a535f Mon Sep 17 00:00:00 2001
> >>>>From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome@mediaarea.net>
> >>>>Date: Fri, 5 Jan 2018 11:09:01 +0100
> >>>>Subject: [PATCH] avcodec/ffv1enc: mark RGB48 support as non-experimental
> >>>>
> >>>>Resulting bitstream was tested with a conformance checker
> >>>>using the last draft of FFV1 specifications.
> >>>But has the way this is stored been optimized ?
> >>>
> >>>Once its marked as non exerimental all future decoders must support the exact
> >>>way.
> >>Although this is considered experimental in the encoder, the implementation
> >>adheres to the description in the specification. The bitstream specification
> >>does not provide a bitdepth limit so with the current draft of the
> >>specification, another FFV1 encoder could already encode 16-bit (and more)
> >>content. The work on the specification has been careful to not break
> >>compatibility with former drafts and at this point the FFV1 bitstream
> >>specification for versions 0, 1, and 3 should be considered already
> >>non-experimental for all bit depths. All current decoders should already
> >>support the exact way it is currently specified.
> >>
> >>To make a change in the specification at this point would have cascading
> >>consequences as we’d have to retract the part of the specification which
> >>states that micro_version 4 of version 3 is the first stable variant. Worse,
> >>it is impossible to indicate a bitstream change in FFV1 version 1, which
> >>permits RGB 16-bit content too, so it would be difficult for a decoder to
> >>detect a bitstream not conforming to the bitstream created by the current
> >>version of FFmpeg encoder.
> >Are you not making this look alot more complex than it is ?
> >Or maybe we talk about slightly different things here
> >
> >with the next version we can introduce any method of storing 16bit or 9-15 bit
> >and we certainly do not support in the implementation all possible bit depths
> >
> > From what i remember I had always wanted to improve the way that
> >more than 8bit is handled, not just 16. Although 16 is a bit special
> >
> >Consider this:
> >If we improve get_context() in the next version for >8bit
> >we still have to support 9-15 bit with the old definition
> >if we now declare 16bit non experimental then we also must support that with
> >an old get_context() in the decoder.
> >the 16bit path is seperate from the lower bit depth. So this is an Additional
> >codepath that we have to carry in the future
> >
> >isnt it smarter now that if we want to improve get_context() that we
> >dont now extend what can be generated with the current get_context ?
> >
> >or are such current get_context() style files already widespread ?
> >if so then its probably best to accept it and keep supporting it
> 
> I am lost.
> Looks like we talk about 2 different subjects: FFV1 bitstream specifications
> and FFmpeg implementation.
> Let separate subjects:
> 

[...]

> FFmpeg implementation:
> FFV1 YCbCr 16-bit is already flagged as non experimental, so there is
> already some non experimental 16-bit support in FFmpeg FFV1 encoder. 16-bit
> is not new and for RGB48 the actual encoding after RGB to YCbCr
> transformation is just 1 bit more (17-bit).

This is correct but i think misleading a bit
the 17bit case this is about uses a seperate codepath. So if its enabled
we generate new files that have never been generated before in some sense
AFAIK

If we change the bitstream in a future version, which i belive we 
should consider. Then we have an additional "old" version of the 17bit path
that needs to be supported in implementations.


> FFmpeg experimental flag is for the status of the encoder, not for the
> status of the bitstream (the bitstream for versions 0, 1, 3 is already
> considered stable for RGB48 and others)

I think i added the flag check. The reason behind the check was so that the
bitstream syntax can be changed without the need to support every iteration
of the bitstream.
I had hoped someone would fund research and testing of further improvments 
to the various fine details of higher bit depth encoding beyond 8bit.
IIRC No further funding was provided, Noone worked on it as a volunteer,
No changes where proposed  ...

But it wasnt intended as a "bitstream is in stone, encoder might mismatch
the spec" at the time.

We have a draft spec now that does not limit bitdepth in any way, this may
have been a mistakke but i dont see this as a big problem honestly. I do not
propose to change this. But i would not oppose it if people want to change it

If someone creates a 19bit per sample file based on the draft spec it also
will not decode with most real world implementations.
There is no question that with a unlimited bitdepth, real implementations
will never support some depths

I just dont want to create a new variant of files _IF_ we plan to work on
improving the "bitstream syntax" in the next version.
Of course if these files are already out in the wild then we must support
this in the implementation. And then most of this discussion is meaningless

[...]
Jerome Martinez Jan. 7, 2018, 8:20 p.m. UTC | #6
On 07/01/2018 20:08, Michael Niedermayer wrote:
> [...]
> This is correct but i think misleading a bit
> the 17bit case this is about uses a seperate codepath.

For your (FFmpeg) encoder and decoder. Not mine (same code path is used 
for 8/10/12/16/... bit RGB and YUV with my encoder and decoder).
Again, we mix up bitstream specification and FFmpeg implementation.
In the bitstream specifications, there is currently only one path 
(except for handling files in the wild which are not conform to the 
unique path, we take care of them for historical reasons).

>   So if its enabled
> we generate new files that have never been generated before in some sense
> AFAIK

- MediaConch conformance checker can check files up to 30 bits per 
component, and already implements the way it is written in spec for all 
supported bit depths, because the spec was flagged as stable whatever is 
the bit depth for a long time, without having anyone saying that 16 or 
17-bit for RGB (reminder: it is already set as "stable" for YCbCr 
16-bit) may have a different paths later for versions 0, 1, 3. If you 
change the bitstream of RGB48 or any stream with bitdepth <=30, you 
break it despite the fact it is validating correctly and would be a 
major issue for this tool (breaking trust about the tool or FFV1, as 
there would be 2 variants of FFV1 RGB48).
- I have an early (not yet public, for testing the spec only for the 
moment) version of an encoder conforming to the spec for all bit depths 
up to 30-bit per component.
- I have heard about other FFV1 encoders able to encode RGB48

>
> If we change the bitstream in a future version, which i belive we
> should consider. Then we have an additional "old" version of the 17bit path
> that needs to be supported in implementations.

question: How would you detect old version, from all encoders (not only 
FFmpeg)? there is nothing permitting that in the bitstream AFAIK (for 
v1: no micro_version; for v3: micro version >4 must be compatible with 
v4 as v4 is flagged stable).
So it is "bitstream is in stone" now, for at least versions 0, 1, 3. 
Reason I speak about R&D with version 4 bitstream (I don't speak about 
FFmpeg), which is still flagged as experimental for all files.

>
>
>> FFmpeg experimental flag is for the status of the encoder, not for the
>> status of the bitstream (the bitstream for versions 0, 1, 3 is already
>> considered stable for RGB48 and others)
> I think i added the flag check. The reason behind the check was so that the
> bitstream syntax can be changed without the need to support every iteration
> of the bitstream.
> I had hoped someone would fund research and testing of further improvments
> to the various fine details of higher bit depth encoding beyond 8bit.
> IIRC No further funding was provided, Noone worked on it as a volunteer,
> No changes where proposed  ...

This is planned on my side after FFV1 versions 0, 1, 3 are finalized. 
With version 4 (the experimental version).
but it is possible only if we all are in sync and don't do something 
against the consensus, and as far I as I understand the consensus is 
that versions 0, 1, 3 are "bitstream is in stone" now (and actually from 
the beginning of CELLAR) based on the draft of FFV1 specifications, 
which is detailed before going to IETF but not changed. All the 
communication, at IETF and conferences, around FFV1 versions 0, 1, 3 is 
that the bitstream specification is stable, and discussing about 
breaking this consensus may harm FFV1 spread.

>
> But it wasnt intended as a "bitstream is in stone, encoder might mismatch
> the spec" at the time.

I disagree: the idea behind CELLAR is that all encoders **must** match 
the spec, or there is misunderstanding to clarify. Else everyone does 
his own version of FFV1, and we can not work together on an unique 
lossless compression format. The spec is expected to be the reference 
(for versions 0, 1, 3 for the moment) and encoders are expected to match 
the spec.

>
> We have a draft spec now that does not limit bitdepth in any way, this may
> have been a mistakke but i dont see this as a big problem honestly. I do not
> propose to change this. But i would not oppose it if people want to change it
>
> If someone creates a 19bit per sample file based on the draft spec it also
> will not decode with most real world implementations.

It will with my conformance checker. You can not know what is "real 
world", as a couple of encoders may be in house only.
we still mix up bitstream specification and one implementation.
The idea behind CELLAR is to have FFV1 a standardized video format, so 
we can not decide for 1 encoder to change the bitstream. We need to find 
a consensus on CELLAR mailing-list first. The consensus is what is 
written in the draft and there was no post on CELLAR mailing-list for 
limiting to some bit depths.

> There is no question that with a unlimited bitdepth, real implementations
> will never support some depths

Whatever is the support from the encoders you know, you can not know 
what was created by others based on the bitstream specification. so the 
bitstream is specified (for versions 0, 1, 3) for all bit depths and we 
can not change that now, as it is written for a long time in spec that 
the spec is flagged stable for these versions.

The question is not what is the support from decoder x, the question is 
that if there is a plan to break the compatibility between current 
version of FFV1 draft and future versions of this document.

>
> I just dont want to create a new variant of files _IF_ we plan to work on
> improving the "bitstream syntax" in the next version.

I don't understand: yes, we plan to improve the bitstream, and this is 
the reason we plan a version 4, 5, 6... But it does not mean that 
versions 0, 1, 3 are not used by FFmpeg or any other encoder for all bit 
depths.

But again, here (ffmpeg-devel), my goal was to speak about FFmpeg 
encoder, it was not intended to speak about FFV1 specification, and it 
is weird for me to have to speak about FFV1 specification on 
ffmpeg-devel (it should be on CELLAR only).
Being sure that FFmpeg is creating a bitstream conforming to FFV1 
specifications (so versions 0, 1, 3) should be the only criteria.

> Of course if these files are already out in the wild then we must support
> this in the implementation. And then most of this discussion is meaningless

I confirm that RGB48 files are already in the wild, as it is needed by 
some archives, and I confirm that they rely on MediaConch for testing 
the conformance compared to the specification.

I still don't see a reason to block 1 encoder to create RGB48 with 
version 1 or 3, as the spec is clear for a long time about how the 
bitstream is for such bit depth. Note that the FFV1 RGB48 decoder is not 
flagged as experimental, so any old version of FFmpeg should be able to 
decode new files you want to create (I don't see how they could do that 
as they don't know the get_context you want to implement) if you don't 
want to have complain that an old stable version of FFmpeg is not able 
to decode a FFV1 RGB48 file you just created with the new FFmpeg 
implementation.

Again, the experimental flag is for FFmpeg encoder, not the FFV1 
bitstream, the FFV1 bitstream is flagged as stable in FFV1 
specification, including RGB48.

Additionally, FFmpeg FFV1 decoder is currently able to decode RGB48 as 
specified in FFV1 specification and created by encoders conforming to 
the spec (FFmpeg "experimental" included) without having to set "-strict 
experimental" on the command line.

For these reasons, I still argue to remove the experimental flag for 
this encoder about RGB48 as the output is conform to FFV1 specifications 
and current and older versions of FFmpeg would not be able to decode 
FFV1 RGB48 if get_context is changed.

Jérôme
Michael Niedermayer Jan. 7, 2018, 11:41 p.m. UTC | #7
On Sun, Jan 07, 2018 at 09:20:15PM +0100, Jerome Martinez wrote:
> On 07/01/2018 20:08, Michael Niedermayer wrote:
> >[...]
> >This is correct but i think misleading a bit
> >the 17bit case this is about uses a seperate codepath.
> 
> For your (FFmpeg) encoder and decoder. Not mine (same code path is used for
> 8/10/12/16/... bit RGB and YUV with my encoder and decoder).
> Again, we mix up bitstream specification and FFmpeg implementation.

The seperation of 16bit and >16bit results out of the data type size
fitting or not fitting in "int16".

A space/cache efficient implementation, possibly one using SIMD would
use seperate codepaths for 16 and > 16 on a normal architecture thats based on
8bit bytes.

Its part of spec design what "an efficient implementation" would/could do


[...]
> >
> >If we change the bitstream in a future version, which i belive we
> >should consider. Then we have an additional "old" version of the 17bit path
> >that needs to be supported in implementations.
> 
> question: How would you detect old version, from all encoders (not only
> FFmpeg)? there is nothing permitting that in the bitstream AFAIK (for v1: no
> micro_version; for v3: micro version >4 must be compatible with v4 as v4 is
> flagged stable).
> So it is "bitstream is in stone" now, for at least versions 0, 1, 3. Reason
> I speak about R&D with version 4 bitstream (I don't speak about FFmpeg),
> which is still flagged as experimental for all files.

very simple, the lowest version that we can make that change in without
causing any pain to people using ffv1 and without breaking the spec.


[...]
> >
> >But it wasnt intended as a "bitstream is in stone, encoder might mismatch
> >the spec" at the time.
> 
> I disagree: the idea behind CELLAR is that all encoders **must** match the

you disagree what i mean in a years old commit in ffmpeg i authored ?


> spec, or there is misunderstanding to clarify. Else everyone does his own
> version of FFV1, and we can not work together on an unique lossless
> compression format. The spec is expected to be the reference (for versions
> 0, 1, 3 for the moment) and encoders are expected to match the spec.

you make no sense
This code was intended to be used for developing the next version, that didnt
happen. If it did happen the code in the implementation would have changed
and once it was looking optimal a suggestion with test results would have
been posted to CELLAR to update the draft/spec. If that update did happen
then once its "stable" the check would have been removed from the encoder
implementation so people could use it.


[...]

> 
> >There is no question that with a unlimited bitdepth, real implementations
> >will never support some depths
> 
> Whatever is the support from the encoders you know, you can not know what
> was created by others based on the bitstream specification. so the bitstream
> is specified (for versions 0, 1, 3) for all bit depths and we can not change
> that now, as it is written for a long time in spec that the spec is flagged
> stable for these versions.

I can know what is possible with real implementations build by others because
they are constrained by the same physical laws and space and matter available
in the observable universe.


> 
> The question is not what is the support from decoder x, the question is that
> if there is a plan to break the compatibility between current version of
> FFV1 draft and future versions of this document.

I think its more like a circular reference
The draft/spec intended to describe the existing status quo
and while in the implementation something was marked experimental this 
detail was lost in the spec 


[...]

> I confirm that RGB48 files are already in the wild, as it is needed by some
> archives, and I confirm that they rely on MediaConch for testing the
> conformance compared to the specification.

Thanks, then its probably best if we support this format in en and decoder
implementations. As its out there already

[...]
compn Jan. 8, 2018, 12:39 a.m. UTC | #8
On Sun, 7 Jan 2018 21:20:15 +0100, Jerome Martinez
<jerome@mediaarea.net> wrote:

> - I have an early (not yet public, for testing the spec only for the 
> moment) version of an encoder conforming to the spec for all bit depths 
> up to 30-bit per component.
> - I have heard about other FFV1 encoders able to encode RGB48

i am curious what are the names of the other ffv1 encoders? 


> I confirm that RGB48 files are already in the wild, as it is needed 

please upload or link to one of these RGB48 samples and ffmpeg will
support it.

i think i can clear up the confusion between you and michael.

michael does not want to add in a defined way to do other bitdepths
without the spec people agreeing on a spec for this.

michael does want to support your higher bitdepth ffv1 samples. 

the confusion was because he thought you wanted to modify the spec /
encoder and not just the ability to decode such files.

hope this helps.

-compn
Michael Niedermayer Jan. 12, 2018, 12:39 a.m. UTC | #9
On Fri, Jan 05, 2018 at 10:26:42PM +0100, Jerome Martinez wrote:
> On 05/01/2018 16:14, Tobias Rapp wrote:
> >On 05.01.2018 11:18, Jerome Martinez wrote:
> >>0001-FFV1-make-RGB48-support-as-non-experimental.patch
> >>
> >>From cd1bfe68a1a809700f25e593ac21ca3876d265ad Mon Sep 17 00:00:00 2001
> >>From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome@mediaarea.net>
> >>Date: Fri, 5 Jan 2018 11:09:01 +0100
> >>Subject: [PATCH] FFV1: make RGB48 support as non-experimental
> >
> >make => mark
> 
> I reused a commit text from history, both words words were in it.
> Anyway, attached is the updated .patch with the suggested subject line.
> 
> >
> >BTW: common subject line format would be something like "avcodec/ffv1enc:
> >mark RGB48 support as non-experimental"
> 

>  ffv1enc.c |    4 ----
>  1 file changed, 4 deletions(-)
> acfc60c913b311b148f2eeef2d2d6ea9e37afcf7  0001-avcodec-ffv1enc-mark-RGB48-support-as-non-experiment.patch
> From 303f63fb7e6172fdb7de66da1f8a4006b79a535f Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome@mediaarea.net>
> Date: Fri, 5 Jan 2018 11:09:01 +0100
> Subject: [PATCH] avcodec/ffv1enc: mark RGB48 support as non-experimental
> 
> Resulting bitstream was tested with a conformance checker
> using the last draft of FFV1 specifications.
> ---
>  libavcodec/ffv1enc.c | 4 ----
>  1 file changed, 4 deletions(-)

will apply this with a somewhat expanded commit message

thanks

[...]
diff mbox

Patch

diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index 09df4c0c57..c0c1558ffe 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -630,10 +630,6 @@  FF_ENABLE_DEPRECATION_WARNINGS
         s->bits_per_raw_sample = 16;
         s->use32bit = 1;
         s->version = FFMAX(s->version, 1);
-        if (avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
-            av_log(avctx, AV_LOG_ERROR, "16bit RGB is experimental and under development, only use it for experiments\n");
-            return AVERROR_INVALIDDATA;
-        }
         break;
     case AV_PIX_FMT_0RGB32:
         s->colorspace = 1;