diff mbox series

[FFmpeg-devel,2/2] avcodec/jpeg2000dec: jpeg2000 has its own lowres option

Message ID 20230610183109.24802-2-michael@niedermayer.cc
State Accepted
Commit c012d1f2bb8735f2b17ce88cd8181d2ffc989b02
Headers show
Series [FFmpeg-devel,1/2] avcodec/jpeg2000dec: Check for reduction factor and image offset | 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

Michael Niedermayer June 10, 2023, 6:31 p.m. UTC
jpeg2000 overrides the global lowres variable with a lowres field called reduction_factor
ffmpeg -lowres X causes the reduction_factor to be set
ffplay -lowres X causes both lowres and the reduction_factor to be set
ossfuss sets only lowres

only the ffmpeg variant works. This patch tries to make the other 2 work.

Alternative we could just error out if things are inconsistent.
More complex restructuring should be limited to the master branch
to keep this reasonably easy to backport

Fixes: out of array access
Fixes: 59672/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_JPEG2000

Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavcodec/jpeg2000dec.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

Comments

Tomas Härdin June 24, 2023, 10:53 a.m. UTC | #1
lör 2023-06-10 klockan 20:31 +0200 skrev Michael Niedermayer:
> jpeg2000 overrides the global lowres variable with a lowres field
> called reduction_factor
> ffmpeg -lowres X causes the reduction_factor to be set
> ffplay -lowres X causes both lowres and the reduction_factor to be
> set
> ossfuss sets only lowres

Why does jpeg2000dec have its own -lowres? Does lavc reset it somewhere
to where the decoder can't make use of the avctx-level setting?

/Tomas
Paul B Mahol June 24, 2023, 5:54 p.m. UTC | #2
On Sat, Jun 24, 2023 at 12:53 PM Tomas Härdin <git@haerdin.se> wrote:

> lör 2023-06-10 klockan 20:31 +0200 skrev Michael Niedermayer:
> > jpeg2000 overrides the global lowres variable with a lowres field
> > called reduction_factor
> > ffmpeg -lowres X causes the reduction_factor to be set
> > ffplay -lowres X causes both lowres and the reduction_factor to be
> > set
> > ossfuss sets only lowres
>
> Why does jpeg2000dec have its own -lowres? Does lavc reset it somewhere
> to where the decoder can't make use of the avctx-level setting?
>
>
Libav removed lowres from avctx, but same was not done here.

IMHO lowres is codec-specific thing and only codecs supporting it should
have private option to change it.


> /Tomas
> _______________________________________________
> 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".
>
Tomas Härdin June 24, 2023, 8:46 p.m. UTC | #3
lör 2023-06-24 klockan 19:54 +0200 skrev Paul B Mahol:
> On Sat, Jun 24, 2023 at 12:53 PM Tomas Härdin <git@haerdin.se> wrote:
> 
> > lör 2023-06-10 klockan 20:31 +0200 skrev Michael Niedermayer:
> > > jpeg2000 overrides the global lowres variable with a lowres field
> > > called reduction_factor
> > > ffmpeg -lowres X causes the reduction_factor to be set
> > > ffplay -lowres X causes both lowres and the reduction_factor to
> > > be
> > > set
> > > ossfuss sets only lowres
> > 
> > Why does jpeg2000dec have its own -lowres? Does lavc reset it
> > somewhere
> > to where the decoder can't make use of the avctx-level setting?
> > 
> > 
> Libav removed lowres from avctx, but same was not done here.
> 
> IMHO lowres is codec-specific thing and only codecs supporting it
> should
> have private option to change it.

Enough codecs support lowres that marking support for it in codec caps
may be worthwhile. Something to consider for the future.

/Tomas
James Almer June 24, 2023, 8:56 p.m. UTC | #4
On 6/24/2023 5:46 PM, Tomas Härdin wrote:
> lör 2023-06-24 klockan 19:54 +0200 skrev Paul B Mahol:
>> On Sat, Jun 24, 2023 at 12:53 PM Tomas Härdin <git@haerdin.se> wrote:
>>
>>> lör 2023-06-10 klockan 20:31 +0200 skrev Michael Niedermayer:
>>>> jpeg2000 overrides the global lowres variable with a lowres field
>>>> called reduction_factor
>>>> ffmpeg -lowres X causes the reduction_factor to be set
>>>> ffplay -lowres X causes both lowres and the reduction_factor to
>>>> be
>>>> set
>>>> ossfuss sets only lowres
>>>
>>> Why does jpeg2000dec have its own -lowres? Does lavc reset it
>>> somewhere
>>> to where the decoder can't make use of the avctx-level setting?
>>>
>>>
>> Libav removed lowres from avctx, but same was not done here.
>>
>> IMHO lowres is codec-specific thing and only codecs supporting it
>> should
>> have private option to change it.
> 
> Enough codecs support lowres that marking support for it in codec caps
> may be worthwhile. Something to consider for the future.

There's AVCodec.max_lowres, which when not zero it means the decoder 
supports lowres.

> 
> /Tomas
> _______________________________________________
> 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 Sept. 4, 2023, 7 p.m. UTC | #5
On Sat, Jun 10, 2023 at 08:31:09PM +0200, Michael Niedermayer wrote:
> jpeg2000 overrides the global lowres variable with a lowres field called reduction_factor
> ffmpeg -lowres X causes the reduction_factor to be set
> ffplay -lowres X causes both lowres and the reduction_factor to be set
> ossfuss sets only lowres
> 
> only the ffmpeg variant works. This patch tries to make the other 2 work.
> 
> Alternative we could just error out if things are inconsistent.
> More complex restructuring should be limited to the master branch
> to keep this reasonably easy to backport
> 
> Fixes: out of array access
> Fixes: 59672/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_JPEG2000
> 
> Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
>  libavcodec/jpeg2000dec.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)

if there are no objections then i plan to apply this in a few days

[...]
diff mbox series

Patch

diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
index d6f2a5938e..dc484344ab 100644
--- a/libavcodec/jpeg2000dec.c
+++ b/libavcodec/jpeg2000dec.c
@@ -308,7 +308,7 @@  static int get_siz(Jpeg2000DecoderContext *s)
         dimy = FFMAX(dimy, ff_jpeg2000_ceildiv(o_dimy, s->cdy[i]));
     }
 
-    ret = ff_set_dimensions(s->avctx, dimx, dimy);
+    ret = ff_set_dimensions(s->avctx, dimx << s->avctx->lowres, dimy << s->avctx->lowres);
     if (ret < 0)
         return ret;
 
@@ -2426,6 +2426,14 @@  static av_cold int jpeg2000_decode_init(AVCodecContext *avctx)
 {
     Jpeg2000DecoderContext *s = avctx->priv_data;
 
+    if (avctx->lowres)
+        av_log(avctx, AV_LOG_WARNING, "lowres is overriden by reduction_factor but set anyway\n");
+    if (!s->reduction_factor && avctx->lowres < JPEG2000_MAX_RESLEVELS) {
+        s->reduction_factor = avctx->lowres;
+    }
+    if (avctx->lowres != s->reduction_factor && avctx->lowres)
+        return AVERROR(EINVAL);
+
     ff_jpeg2000dsp_init(&s->dsp);
     ff_jpeg2000_init_tier1_luts();