jpegdec: only allow conversions from RGB
authorGuillaume Desmottes <guillaume.desmottes@onestream.live>
Mon, 6 Dec 2021 14:37:06 +0000 (15:37 +0100)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 6 Dec 2021 16:52:38 +0000 (16:52 +0000)
libjpeg-turbo only supports converting from RGB to other RGB formats.
Fix runtime error when trying to convert from a YUV format for example.

Fix #916

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1421>

subprojects/gst-plugins-good/ext/jpeg/gstjpegdec.c

index db81b41..3b66e26 100644 (file)
@@ -1071,8 +1071,9 @@ gst_jpeg_dec_negotiate (GstJpegDec * dec, gint width, gint height, gint clrspc,
     peerformat = gst_structure_get_string (peerstruct, "format");
     peerfmt = gst_video_format_from_string (peerformat);
 
+    /* libjpeg-turbo only supports some colorspace conversions, see
+     * https://raw.githubusercontent.com/libjpeg-turbo/libjpeg-turbo/main/libjpeg.txt */
     switch (peerfmt) {
-      case GST_VIDEO_FORMAT_RGB:
       case GST_VIDEO_FORMAT_RGBx:
       case GST_VIDEO_FORMAT_xRGB:
       case GST_VIDEO_FORMAT_RGBA:
@@ -1082,11 +1083,14 @@ gst_jpeg_dec_negotiate (GstJpegDec * dec, gint width, gint height, gint clrspc,
       case GST_VIDEO_FORMAT_xBGR:
       case GST_VIDEO_FORMAT_BGRA:
       case GST_VIDEO_FORMAT_ABGR:
-        clrspc = JCS_RGB;
-        format = peerfmt;
-        dec->format_convert = TRUE;
-        dec->libjpeg_ext_format = gst_fmt_to_jpeg_turbo_ext_fmt (peerfmt);
+        if (clrspc == JCS_RGB) {
+          /* RGB -> other RGB formats */
+          format = peerfmt;
+          dec->format_convert = TRUE;
+          dec->libjpeg_ext_format = gst_fmt_to_jpeg_turbo_ext_fmt (peerfmt);
+        }
         break;
+        /* TODO: implement conversion from/to other supported colorspaces */
       default:
         break;
     }