jpegdecoder: return the real error of decode_scan and decode_frame.
authorHe Junyan <junyan.he@intel.com>
Thu, 25 Aug 2022 07:28:21 +0000 (15:28 +0800)
committerHe Junyan <junyan.he@intel.com>
Thu, 25 Aug 2022 09:42:55 +0000 (17:42 +0800)
The current handle_frame() does not return the real error that happens
in decode_scan and decode_frame, which makes the pipeline continue with
the error and may trigger asserting later.

We also return the error when decode_quant_table or decode_huffman_table
fails.

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

subprojects/gst-plugins-bad/sys/va/gstjpegdecoder.c

index 5b89451..fbed9d8 100644 (file)
@@ -450,7 +450,8 @@ gst_jpeg_decoder_handle_frame (GstVideoDecoder * decoder,
         offset = seg_scan.offset - 2;
         seg.size = offset - seg.offset;
 
-        if (decode_scan (self, &seg) != GST_FLOW_OK)
+        ret = decode_scan (self, &seg);
+        if (ret != GST_FLOW_OK)
           goto unmap_and_error;
 
         break;
@@ -462,12 +463,16 @@ gst_jpeg_decoder_handle_frame (GstVideoDecoder * decoder,
         GST_FIXME_OBJECT (self, "Arithmetic coding mode unsupported");
         goto unmap_and_error;
       case GST_JPEG_MARKER_DHT:
-        if (!decode_huffman_table (self, &seg))
+        if (!decode_huffman_table (self, &seg)) {
+          ret = GST_FLOW_ERROR;
           goto unmap_and_error;
+        }
         break;
       case GST_JPEG_MARKER_DQT:
-        if (!decode_quant_table (self, &seg))
+        if (!decode_quant_table (self, &seg)) {
+          ret = GST_FLOW_ERROR;
           goto unmap_and_error;
+        }
         break;
 
       case GST_JPEG_MARKER_DRI:
@@ -481,7 +486,8 @@ gst_jpeg_decoder_handle_frame (GstVideoDecoder * decoder,
         /* SOFn (Start Of Frame) */
         if (marker >= GST_JPEG_MARKER_SOF_MIN &&
             marker <= GST_JPEG_MARKER_SOF_MAX) {
-          if (decode_frame (self, &seg, frame) != GST_FLOW_OK)
+          ret = decode_frame (self, &seg, frame);
+          if (ret != GST_FLOW_OK)
             goto unmap_and_error;
         }
         break;