[FFmpeg-devel] [PATCH] acvodec/lipopenjpeg: Improve XYZ color space detection
Michael Bradshaw
mjbshaw at gmail.com
Mon Mar 2 23:49:40 CET 2015
On Mon, Mar 2, 2015 at 7:08 AM, Vilius Grigaliūnas <
vilius.grigaliunas at gmail.com> wrote:
> Input files in XYZ color space are incorrecly detected as RGB which results
> in incorrect output colors.
>
> This changes pixel format detection to try XYZ before RGB when
> color space provided by libopenjepg is unknown.
>
Is this really desirable, though? The most common case should be the
default. If XYZ is the most common use case for ffmpeg/avcodec users, then
sure, this is good. But I'm not convinced XYZ is more common than RGB. I
believe RGB is more common than XYZ, and as such should remain the default.
> ---
> libavcodec/libopenjpegdec.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/libavcodec/libopenjpegdec.c b/libavcodec/libopenjpegdec.c
> index 02b1ceb..23febd7 100644
> --- a/libavcodec/libopenjpegdec.c
> +++ b/libavcodec/libopenjpegdec.c
> @@ -77,7 +77,7 @@ static const enum AVPixelFormat
> libopenjpeg_yuv_pix_fmts[] = {
> YUV_PIXEL_FORMATS
> };
> static const enum AVPixelFormat libopenjpeg_all_pix_fmts[] = {
> - RGB_PIXEL_FORMATS, GRAY_PIXEL_FORMATS, YUV_PIXEL_FORMATS,
> XYZ_PIXEL_FORMATS
> + XYZ_PIXEL_FORMATS, RGB_PIXEL_FORMATS, GRAY_PIXEL_FORMATS,
> YUV_PIXEL_FORMATS
> };
>
> typedef struct LibOpenJPEGContext {
> @@ -184,10 +184,11 @@ static inline void
> libopenjpeg_copy_to_packed8(AVFrame *picture, opj_image_t *im
>
> static inline void libopenjpeg_copy_to_packed16(AVFrame *picture,
> opj_image_t *image) {
> uint16_t *img_ptr;
> + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(picture->format);
> int index, x, y, c;
> int adjust[4];
> for (x = 0; x < image->numcomps; x++)
> - adjust[x] =
> FFMAX(FFMIN(av_pix_fmt_desc_get(picture->format)->comp[x].depth_minus1 + 1
> - image->comps[x].prec, 8), 0);
> + adjust[x] = FFMAX(FFMIN(desc->comp[x].depth_minus1 + 1 -
> image->comps[x].prec, 8), 0);
>
This small cleanup/micro optimization is better in a different patch. It
seems unrelated to testing XYZ before RGB. Same for the similar change to
libopenjpeg_copyto16().
>
> for (y = 0; y < picture->height; y++) {
> index = y * picture->width;
> @@ -195,7 +196,7 @@ static inline void
> libopenjpeg_copy_to_packed16(AVFrame *picture, opj_image_t *i
> for (x = 0; x < picture->width; x++, index++)
> for (c = 0; c < image->numcomps; c++)
> *img_ptr++ = (1 << image->comps[c].prec - 1) *
> image->comps[c].sgnd +
> - (unsigned)image->comps[c].data[index] <<
> adjust[c];
> + (unsigned)image->comps[c].data[index] <<
> adjust[c] << desc->comp[c].shift;
>
This seems like an unrelated change to XYZ detection as well.
> }
> }
>
> @@ -220,10 +221,11 @@ static inline void libopenjpeg_copyto8(AVFrame
> *picture, opj_image_t *image) {
> static inline void libopenjpeg_copyto16(AVFrame *picture, opj_image_t
> *image) {
> int *comp_data;
> uint16_t *img_ptr;
> + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(picture->format);
> int index, x, y;
> int adjust[4];
> for (x = 0; x < image->numcomps; x++)
> - adjust[x] =
> FFMAX(FFMIN(av_pix_fmt_desc_get(picture->format)->comp[x].depth_minus1 + 1
> - image->comps[x].prec, 8), 0);
> + adjust[x] = FFMAX(FFMIN(desc->comp[x].depth_minus1 + 1 -
> image->comps[x].prec, 8), 0);
>
> for (index = 0; index < image->numcomps; index++) {
> comp_data = image->comps[index].data;
> @@ -231,7 +233,7 @@ static inline void libopenjpeg_copyto16(AVFrame
> *picture, opj_image_t *image) {
> img_ptr = (uint16_t *)(picture->data[index] + y *
> picture->linesize[index]);
> for (x = 0; x < image->comps[index].w; x++) {
> *img_ptr = (1 << image->comps[index].prec - 1) *
> image->comps[index].sgnd +
> - (unsigned)*comp_data << adjust[index];
> + (unsigned)*comp_data << adjust[index] <<
> desc->comp[index].shift;
> img_ptr++;
> comp_data++;
> }
> --
> 1.7.9.5
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
More information about the ffmpeg-devel
mailing list