Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP
@ 2024-01-30 21:21 Andreas Rheinhardt
  2024-01-30 21:26 ` [FFmpeg-devel] [PATCH 2/3] avcodec/vp8: Remove write-only vp7 struct field Andreas Rheinhardt
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Andreas Rheinhardt @ 2024-01-30 21:21 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Andreas Rheinhardt

VP8-in-WebP only uses key frame encoding (see [1]), yet this
is currently not enforced. This commit does so in order to
make output reproducible with frame-threading as the VP8 decoder's
update_thread_context is not called at all when using decoding
VP8-in-WebP (as this is unnecessary for key frame-only streams).

[1]: https://developers.google.com/speed/webp/docs/riff_container

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/vp8.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index 83c60adeb0..7972775a1c 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -2665,7 +2665,11 @@ int vp78_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame,
     if (ret < 0)
         goto err;
 
-    if (s->actually_webp) {
+    if (!is_vp7 && s->actually_webp) {
+        // VP8 in WebP is supposed to be intra-only. Enforce this here
+        // to ensure that output is reproducible with frame-threading.
+        if (!s->keyframe)
+            return AVERROR_INVALIDDATA;
         // avctx->pix_fmt already set in caller.
     } else if (!is_vp7 && s->pix_fmt == AV_PIX_FMT_NONE) {
         s->pix_fmt = get_pixel_format(s);
-- 
2.34.1

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [FFmpeg-devel] [PATCH 2/3] avcodec/vp8: Remove write-only vp7 struct field
  2024-01-30 21:21 [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP Andreas Rheinhardt
@ 2024-01-30 21:26 ` Andreas Rheinhardt
  2024-01-30 21:26 ` [FFmpeg-devel] [PATCH 3/3] avcodec/vp8: Change criterion for calling ff_thread_finish_setup() Andreas Rheinhardt
  2024-02-03 13:57 ` [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP Andreas Rheinhardt
  2 siblings, 0 replies; 5+ messages in thread
From: Andreas Rheinhardt @ 2024-01-30 21:26 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Andreas Rheinhardt

This decoder always inlines whether it is VP7 or VP8.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
It even inlines pretty cold code...

 libavcodec/vp8.c | 1 -
 libavcodec/vp8.h | 2 --
 2 files changed, 3 deletions(-)

diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index 7972775a1c..6b49ec9fe7 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -2887,7 +2887,6 @@ int vp78_decode_init(AVCodecContext *avctx, int is_vp7)
     int ret;
 
     s->avctx = avctx;
-    s->vp7   = avctx->codec->id == AV_CODEC_ID_VP7;
     s->pix_fmt = AV_PIX_FMT_NONE;
     avctx->pix_fmt = AV_PIX_FMT_YUV420P;
 
diff --git a/libavcodec/vp8.h b/libavcodec/vp8.h
index eb9fa2f166..798f67b3de 100644
--- a/libavcodec/vp8.h
+++ b/libavcodec/vp8.h
@@ -331,8 +331,6 @@ typedef struct VP8Context {
     int (*decode_mb_row_no_filter)(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr);
     void (*filter_mb_row)(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr);
 
-    int vp7;
-
     /**
      * Interframe DC prediction (VP7)
      * [0] VP8_FRAME_PREVIOUS
-- 
2.34.1

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [FFmpeg-devel] [PATCH 3/3] avcodec/vp8: Change criterion for calling ff_thread_finish_setup()
  2024-01-30 21:21 [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP Andreas Rheinhardt
  2024-01-30 21:26 ` [FFmpeg-devel] [PATCH 2/3] avcodec/vp8: Remove write-only vp7 struct field Andreas Rheinhardt
@ 2024-01-30 21:26 ` Andreas Rheinhardt
  2024-02-03 13:57 ` [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP Andreas Rheinhardt
  2 siblings, 0 replies; 5+ messages in thread
From: Andreas Rheinhardt @ 2024-01-30 21:26 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Andreas Rheinhardt

The current criterion is to check for the existence of
update_thread_context. Change this to check for whether
we are actually decoding VP8 (and not VP7 or VP8-in-WebP).
This is equivalent to the current criterion, but allows
the WebP decoder to evolve and to get its own update_thread_context.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/vp8.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index 6b49ec9fe7..dd6c1b361b 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -2754,7 +2754,7 @@ int vp78_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame,
 
     s->next_framep[VP8_FRAME_CURRENT] = curframe;
 
-    if (ffcodec(avctx->codec)->update_thread_context)
+    if (!is_vp7 && !s->actually_webp)
         ff_thread_finish_setup(avctx);
 
     if (avctx->hwaccel) {
-- 
2.34.1

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP
  2024-01-30 21:21 [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP Andreas Rheinhardt
  2024-01-30 21:26 ` [FFmpeg-devel] [PATCH 2/3] avcodec/vp8: Remove write-only vp7 struct field Andreas Rheinhardt
  2024-01-30 21:26 ` [FFmpeg-devel] [PATCH 3/3] avcodec/vp8: Change criterion for calling ff_thread_finish_setup() Andreas Rheinhardt
@ 2024-02-03 13:57 ` Andreas Rheinhardt
  2024-02-04 11:02   ` Thilo Borgmann via ffmpeg-devel
  2 siblings, 1 reply; 5+ messages in thread
From: Andreas Rheinhardt @ 2024-02-03 13:57 UTC (permalink / raw)
  To: ffmpeg-devel

Andreas Rheinhardt:
> VP8-in-WebP only uses key frame encoding (see [1]), yet this
> is currently not enforced. This commit does so in order to
> make output reproducible with frame-threading as the VP8 decoder's
> update_thread_context is not called at all when using decoding
> VP8-in-WebP (as this is unnecessary for key frame-only streams).
> 
> [1]: https://developers.google.com/speed/webp/docs/riff_container
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
> ---
>  libavcodec/vp8.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
> index 83c60adeb0..7972775a1c 100644
> --- a/libavcodec/vp8.c
> +++ b/libavcodec/vp8.c
> @@ -2665,7 +2665,11 @@ int vp78_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame,
>      if (ret < 0)
>          goto err;
>  
> -    if (s->actually_webp) {
> +    if (!is_vp7 && s->actually_webp) {
> +        // VP8 in WebP is supposed to be intra-only. Enforce this here
> +        // to ensure that output is reproducible with frame-threading.
> +        if (!s->keyframe)
> +            return AVERROR_INVALIDDATA;
>          // avctx->pix_fmt already set in caller.
>      } else if (!is_vp7 && s->pix_fmt == AV_PIX_FMT_NONE) {
>          s->pix_fmt = get_pixel_format(s);

Will apply this patchset tomorrow unless there are objections.

- Andreas

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP
  2024-02-03 13:57 ` [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP Andreas Rheinhardt
@ 2024-02-04 11:02   ` Thilo Borgmann via ffmpeg-devel
  0 siblings, 0 replies; 5+ messages in thread
From: Thilo Borgmann via ffmpeg-devel @ 2024-02-04 11:02 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Thilo Borgmann



On 03.02.24 14:57, Andreas Rheinhardt wrote:
> Andreas Rheinhardt:
>> VP8-in-WebP only uses key frame encoding (see [1]), yet this
>> is currently not enforced. This commit does so in order to
>> make output reproducible with frame-threading as the VP8 decoder's
>> update_thread_context is not called at all when using decoding
>> VP8-in-WebP (as this is unnecessary for key frame-only streams).
>>
>> [1]: https://developers.google.com/speed/webp/docs/riff_container
>>
>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
>> ---
>>   libavcodec/vp8.c | 6 +++++-
>>   1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
>> index 83c60adeb0..7972775a1c 100644
>> --- a/libavcodec/vp8.c
>> +++ b/libavcodec/vp8.c
>> @@ -2665,7 +2665,11 @@ int vp78_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame,
>>       if (ret < 0)
>>           goto err;
>>   
>> -    if (s->actually_webp) {
>> +    if (!is_vp7 && s->actually_webp) {
>> +        // VP8 in WebP is supposed to be intra-only. Enforce this here
>> +        // to ensure that output is reproducible with frame-threading.
>> +        if (!s->keyframe)
>> +            return AVERROR_INVALIDDATA;
>>           // avctx->pix_fmt already set in caller.
>>       } else if (!is_vp7 && s->pix_fmt == AV_PIX_FMT_NONE) {
>>           s->pix_fmt = get_pixel_format(s);
> 
> Will apply this patchset tomorrow unless there are objections.

Works as expected for me for a coupled version of the animated webp 
decoder which can follow-up.

Thanks,
Thilo
_______________________________________________
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".

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-02-04 11:03 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-30 21:21 [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP Andreas Rheinhardt
2024-01-30 21:26 ` [FFmpeg-devel] [PATCH 2/3] avcodec/vp8: Remove write-only vp7 struct field Andreas Rheinhardt
2024-01-30 21:26 ` [FFmpeg-devel] [PATCH 3/3] avcodec/vp8: Change criterion for calling ff_thread_finish_setup() Andreas Rheinhardt
2024-02-03 13:57 ` [FFmpeg-devel] [PATCH 1/3] avcodec/vp8: Enforce key-frame only for WebP Andreas Rheinhardt
2024-02-04 11:02   ` Thilo Borgmann via ffmpeg-devel

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git