Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Can't encode to jpeg, mjpeg codec refuses to accept yuv420p pixel format #67

Open
babababag opened this issue Nov 16, 2021 · 0 comments

Comments

@babababag
Copy link

Jpeg output is broken for me on Debian 11.

Example: take Transcode.hs from the demo folder and replace line 34 with below to specify jpeg output.
let ep = FF.EncodingParams (fromIntegral w) (fromIntegral h) 30 (Just FF.avCodecIdMjpeg) Nothing "" (Just "mjpeg")

This is what I get:

$ ./Transcode in.jpg out.jpg
[swscaler @ 0x26777c0] deprecated pixel format used, make sure you did set range correctly
[mjpeg @ 0x26923c0] Specified pixel format yuv420p is invalid or not supported
Transcode: Couldn't open codec
CallStack (from HasCallStack):
  error, called at src/Codec/FFmpeg/Encode.hsc:325:21 in ffmpeg-light-0.14.0-BlGBxINPYl8FPzWDcKbKCe:Codec.FFmpeg.Encode

compared to the what actual ffmpeg says when you specify yuv420p and jpeg:

$ ffmpeg -loglevel debug -i in.jpg -pix_fmt yuv420p out.jpg
[graph 0 input from stream 0:0 @ 0x5626d1d602c0] Setting 'pix_fmt' to value '14'
Incompatible pixel format 'yuv420p' for codec 'mjpeg', auto-selecting format 'yuvj420p'
[format @ 0x5626d1d61080] Setting 'pix_fmts' to value 'yuvj420p'
[swscaler @ 0x5626d1dccc00] deprecated pixel format used, make sure you did set range correctly

FFmpeg auto-selects yuvj420p over yuv420p because apparently yuv420p has the wrong color range for jpeg.

I found these lines in my copy of /usr/include/x86_64-linux-gnu/libavutil/pixfmt.h

AV_PIX_FMT_YUVJ420P,  ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range
AV_PIX_FMT_YUVJ422P,  ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range
AV_PIX_FMT_YUVJ444P,  ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range

but I couldn't find a way to use those colorspaces or set the color range here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant