Opened 2 years ago

Last modified 20 months ago

#10058 open defect

jpeg2000: support paletted images

Reported by: ami_stuff Owned by:
Priority: important Component: avcodec
Version: git-master Keywords: j2k regression
Cc: Blocked By:
Blocking: Reproduced by developer: yes
Analyzed by developer: no

Description

https://github.com/openpreserve/jpylyzer-test-files/raw/master/palettedImage.jp2

openjpeg decodes it with palette

there are also some other unsupported jpeg2000 files marked as valid here:

https://github.com/openpreserve/jpylyzer-test-files

./ffmpeg -i palettedImage.jp2 -y out.bmp
ffmpeg version N-109101-g822da7a317 Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
  configuration: 
  libavutil      57. 42.100 / 57. 42.100
  libavcodec     59. 52.102 / 59. 52.102
  libavformat    59. 34.101 / 59. 34.101
  libavdevice    59.  8.101 / 59.  8.101
  libavfilter     8. 50.100 /  8. 50.100
  libswscale      6.  8.112 /  6.  8.112
  libswresample   4.  9.100 /  4.  9.100
[jpeg2000 @ 0x5647e8d3cd40] SOC marker not present
Input #0, j2k_pipe, from 'palettedImage.jp2':
  Duration: N/A, bitrate: N/A
  Stream #0:0: Video: jpeg2000, pal8, 1024x1024, 25 fps, 25 tbr, 25 tbn
Stream mapping:
  Stream #0:0 -> #0:0 (jpeg2000 (native) -> bmp (native))
Press [q] to stop, [?] for help
[jpeg2000 @ 0x5647e8d4f640] SOC marker not present
Error while decoding stream #0:0: Invalid data found when processing input
[jpeg2000 @ 0x5647e8d50bc0] Progression order RPCL
Output #0, image2, to 'out.bmp':
  Metadata:
    encoder         : Lavf59.34.101
  Stream #0:0: Video: bmp, gray(progressive), 1024x1024, q=2-31, 200 kb/s, 25 fps, 25 tbn
    Metadata:
      encoder         : Lavc59.52.102 bmp
frame=    0 fps=0.0 q=-0.0 size=       0kB time=00:00:00.04 bitrate=   0.0kbits/[image2 @ 0x5647e8d3e0c0] The specified filename 'out.bmp' does not contain an image sequence pattern or a pattern is invalid.
[image2 @ 0x5647e8d3e0c0] Use a pattern such as %03d for an image sequence or use the -update option (with -frames:v 1 if needed) to write a single image.
frame=    1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.322x    
video:1025kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

Change History (13)

comment:1 by Balling, 2 years ago

openjpeg decodes it with palette

No, it does not.

ffplay -i palettedImage.jp2 -vcodec libopenjpeg

while
ffplay -i palettedImage.jp2 -vcodec jpeg2000

works.

in reply to:  1 ; comment:2 by ami_stuff, 2 years ago

Replying to Balling:

openjpeg decodes it with palette

No, it does not.

ffplay -i palettedImage.jp2 -vcodec libopenjpeg

while
ffplay -i palettedImage.jp2 -vcodec jpeg2000

works.

something really strange happens here

with the ffmpeg from my system I get color output:

ffmpeg -vcodec jpeg2000 -i 'palettedImage.jp2' -pix_fmt bgr24 -y out.bmp 
ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
  configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  WARNING: library configuration mismatch
  avcodec     configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libaribb24 --enable-liblensfun --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
[jpeg2000 @ 0x5623cbbd2700] Progression order RPCL
Input #0, j2k_pipe, from 'palettedImage.jp2':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: jpeg2000, pal8, 1024x1024, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (jpeg2000 (native) -> bmp (native))
Press [q] to stop, [?] for help
[jpeg2000 @ 0x5623cbc1c640] Progression order RPCL
Output #0, image2, to 'out.bmp':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0: Video: bmp, bgr24, 1024x1024, q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
    Metadata:
      encoder         : Lavc58.54.100 bmp
frame=    1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.317x    
video:3072kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
 VFS..D jpeg2000             JPEG 2000
 VF...D libopenjpeg          OpenJPEG JPEG 2000 (codec jpeg2000)

but with my own build I get only grayscale output:

./ffmpeg -vcodec jpeg2000 -i palettedImage.jp2 -pix_fmt bgr24 -y out.bmp 
ffmpeg version N-109101-g822da7a317 Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
  configuration: 
  libavutil      57. 42.100 / 57. 42.100
  libavcodec     59. 52.102 / 59. 52.102
  libavformat    59. 34.101 / 59. 34.101
  libavdevice    59.  8.101 / 59.  8.101
  libavfilter     8. 50.100 /  8. 50.100
  libswscale      6.  8.112 /  6.  8.112
  libswresample   4.  9.100 /  4.  9.100
[jpeg2000 @ 0x55770e74bdc0] SOC marker not present
Input #0, j2k_pipe, from 'palettedImage.jp2':
  Duration: N/A, bitrate: N/A
  Stream #0:0: Video: jpeg2000, pal8, 1024x1024, 25 fps, 25 tbr, 25 tbn
Stream mapping:
  Stream #0:0 -> #0:0 (jpeg2000 (native) -> bmp (native))
Press [q] to stop, [?] for help
[jpeg2000 @ 0x55770e75e940] SOC marker not present
Error while decoding stream #0:0: Invalid data found when processing input
[jpeg2000 @ 0x55770e75fec0] Progression order RPCL
Output #0, image2, to 'out.bmp':
  Metadata:
    encoder         : Lavf59.34.101
  Stream #0:0: Video: bmp, bgr24(pc, gbr/unknown/unknown, progressive), 1024x1024, q=2-31, 200 kb/s, 25 fps, 25 tbn
    Metadata:
      encoder         : Lavc59.52.102 bmp
frame=    0 fps=0.0 q=-0.0 size=       0kB time=00:00:00.04 bitrate=   0.0kbits/[image2 @ 0x55770e74d340] The specified filename 'out.bmp' does not contain an image sequence pattern or a pattern is invalid.
[image2 @ 0x55770e74d340] Use a pattern such as %03d for an image sequence or use the -update option (with -frames:v 1 if needed) to write a single image.
frame=    1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.306x    
video:3072kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

My own build has no openjpeg support.

And if that's not enough, the ffmpeg from my system crashes when I force usage of libopenjpeg:

ffmpeg -vcodec libopenjpeg -i 'palettedImage.jp2' -pix_fmt bgr24 -y out.bmp 
ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
  configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  WARNING: library configuration mismatch
  avcodec     configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libaribb24 --enable-liblensfun --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, j2k_pipe, from 'palettedImage.jp2':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: jpeg2000, gray, 1024x1024, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (jpeg2000 (libopenjpeg) -> bmp (native))
Press [q] to stop, [?] for help
free(): invalid pointer
==20017== Invalid write of size 1
==20017==    at 0x53912C8: ??? (in /usr/lib/x86_64-linux-gnu/libavcodec.so.58.54.100)
==20017==    by 0x50F12BF: ??? (in /usr/lib/x86_64-linux-gnu/libavcodec.so.58.54.100)
==20017==    by 0x50F1FC7: avcodec_send_packet (in /usr/lib/x86_64-linux-gnu/libavcodec.so.58.54.100)
==20017==    by 0x4DC9F22: ??? (in /usr/lib/x86_64-linux-gnu/libavformat.so.58.29.100)
==20017==    by 0x4DD2BEF: avformat_find_stream_info (in /usr/lib/x86_64-linux-gnu/libavformat.so.58.29.100)
==20017==    by 0x11D3E3: ??? (in /usr/bin/ffmpeg)
==20017==    by 0x11EFC3: ??? (in /usr/bin/ffmpeg)
==20017==    by 0x115DD7: main (in /usr/bin/ffmpeg)
==20017==  Address 0x11d1b28f is 0 bytes after a block of size 1,048,655 alloc'd
==20017==    at 0x483E0F0: memalign (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==20017==    by 0x483E212: posix_memalign (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==20017==    by 0x6598FFC: av_malloc (in /usr/lib/x86_64-linux-gnu/libavutil.so.56.31.100)
==20017==    by 0x65773AC: av_buffer_alloc (in /usr/lib/x86_64-linux-gnu/libavutil.so.56.31.100)
==20017==    by 0x6577431: av_buffer_allocz (in /usr/lib/x86_64-linux-gnu/libavutil.so.56.31.100)
==20017==    by 0x6577BBC: av_buffer_pool_get (in /usr/lib/x86_64-linux-gnu/libavutil.so.56.31.100)
==20017==    by 0x50F36BB: avcodec_default_get_buffer2 (in /usr/lib/x86_64-linux-gnu/libavcodec.so.58.54.100)
==20017==    by 0x50F3F5A: ??? (in /usr/lib/x86_64-linux-gnu/libavcodec.so.58.54.100)
==20017==    by 0x54BB197: ??? (in /usr/lib/x86_64-linux-gnu/libavcodec.so.58.54.100)
==20017==    by 0x5390D80: ??? (in /usr/lib/x86_64-linux-gnu/libavcodec.so.58.54.100)
==20017==    by 0x50F12BF: ??? (in /usr/lib/x86_64-linux-gnu/libavcodec.so.58.54.100)
==20017==    by 0x50F1FC7: avcodec_send_packet (in /usr/lib/x86_64-linux-gnu/libavcodec.so.58.54.100)
==20017== 
==20017== Invalid read of size 4
==20017==    at 0x6577505: av_buffer_unref (in /usr/lib/x86_64-linux-gnu/libavutil.so.56.31.100)
==20017==    by 0x6583A1B: av_frame_unref (in /usr/lib/x86_64-linux-gnu/libavutil.so.56.31.100)
==20017==    by 0x6583BAD: av_frame_free (in /usr/lib/x86_64-linux-gnu/libavutil.so.56.31.100)
==20017==    by 0x4DC9EE5: ??? (in /usr/lib/x86_64-linux-gnu/libavformat.so.58.29.100)
==20017==    by 0x4DD2BEF: avformat_find_stream_info (in /usr/lib/x86_64-linux-gnu/libavformat.so.58.29.100)
==20017==    by 0x11D3E3: ??? (in /usr/bin/ffmpeg)
==20017==    by 0x11EFC3: ??? (in /usr/bin/ffmpeg)
==20017==    by 0x115DD7: main (in /usr/bin/ffmpeg)
==20017==  Address 0x121a000f15000b1b is not stack'd, malloc'd or (recently) free'd
==20017== 
==20017== 
==20017== Process terminating with default action of signal 11 (SIGSEGV)

in reply to:  1 comment:3 by ami_stuff, 2 years ago

Replying to Balling:

openjpeg decodes it with palette

No, it does not.

ffplay -i palettedImage.jp2 -vcodec libopenjpeg

while
ffplay -i palettedImage.jp2 -vcodec jpeg2000

works.

Do you get color output with this build:

https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-lgpl.tar.xz

https://github.com/BtbN/FFmpeg-Builds/releases

?

It looks like regression for me, I get grayscale output with -vcodec libopenjpeg and -vcodec jpeg2000.

comment:4 by Balling, 2 years ago

Status: newopen

Do you get color output with this build:

No. Yes, with openjpeg: opj_decompress.exe -i palettedImage.jp2 -o dfadf.png

the picture is yellow.

in reply to:  2 ; comment:5 by ami_stuff, 2 years ago

the crash is reproducible with this build:

https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.2.2-arm64-static.tar.xz

so there are at least three bugs here:

  1. regression in native jpeg2000 decoder for paletted images
  2. crash in ffmpeg 4.2.7 with forced libopenjpeg
  3. ffmpeg's libopenjpeg decoder should support decoding of paletted images

in reply to:  5 ; comment:6 by Carl Eugen Hoyos, 2 years ago

Replying to ami_stuff:

the crash is reproducible with this build:

https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.2.2-arm64-static.tar.xz

so there are at least three bugs here:

  1. regression in native jpeg2000 decoder for paletted images

Which FFmpeg version works correctly with the native decoder?

  1. crash in ffmpeg 4.2.7 with forced libopenjpeg

But not with current FFmpeg git head?

  1. ffmpeg's libopenjpeg decoder should support decoding of paletted images

That was not supported by libopenjpeg when I looked last time.

in reply to:  6 ; comment:7 by ami_stuff, 2 years ago

Replying to Carl Eugen Hoyos:

Replying to ami_stuff:

the crash is reproducible with this build:

https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.2.2-arm64-static.tar.xz

so there are at least three bugs here:

  1. regression in native jpeg2000 decoder for paletted images

Which FFmpeg version works correctly with the native decoder?

4.2.7 and 4.2.2, more I didn't test.

  1. crash in ffmpeg 4.2.7 with forced libopenjpeg

But not with current FFmpeg git head?

That's correct, can't reproduce it with git head. But some distros are giving their users outdated ffmpeg versions, so it would be nice to fix it.

  1. ffmpeg's libopenjpeg decoder should support decoding of paletted images

That was not supported by libopenjpeg when I looked last time.

comment:8 by Carl Eugen Hoyos, 2 years ago

Component: undeterminedavcodec
Keywords: j2k regression added
Priority: normalimportant
Reproduced by developer: set
Version: unspecifiedgit-master

Regression since d09c35677defb383f69395cef84a5e20c41da6d2, work-around is to force the image2 demuxer.

comment:9 by Balling, 2 years ago

Yep, that commit also regressed #9145.

in reply to:  7 comment:10 by ami_stuff, 2 years ago

Replying to ami_stuff:

Replying to Carl Eugen Hoyos:

Replying to ami_stuff:

the crash is reproducible with this build:

https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.2.2-arm64-static.tar.xz

  1. crash in ffmpeg 4.2.7 with forced libopenjpeg

But not with current FFmpeg git head?

That's correct, can't reproduce it with git head.

I was wrong, see ticket #10061.

comment:11 by Balling, 2 years ago

ffmpeg -c:v jpeg2000 -f image2 -i palettedImage.jp2 out2123.bmp

produces so off-by-two differences with opj_decompress.exe. Strange, it is lossless, right?

E.g. 28, 20, 0 (opj_decompress.exe) vs 30, 21, 0 (jpeg2000).

Version 0, edited 2 years ago by Balling (next)

comment:13 by Balling, 20 months ago

Genius Michael Niedermayer removed libopenjpeg decoder whatsover. WTF. Encoder is still there, but... 60ccb3fe787be3bb10fc4545b3593cd1e0b769ed

Last edited 20 months ago by Balling (previous) (diff)
Note: See TracTickets for help on using tickets.