diff --git a/gst/rtp/gstrtpjpegpay.c b/gst/rtp/gstrtpjpegpay.c index 15144cf506..aaa8cc4284 100644 --- a/gst/rtp/gstrtpjpegpay.c +++ b/gst/rtp/gstrtpjpegpay.c @@ -417,7 +417,8 @@ no_table: static gboolean gst_rtp_jpeg_pay_read_sof (GstRtpJPEGPay * pay, const guint8 * data, - guint size, guint * offset, CompInfo info[]) + guint size, guint * offset, CompInfo info[], RtpQuantTable tables[], + gulong tables_elements) { guint sof_size, off; guint width, height, infolen; @@ -495,8 +496,18 @@ gst_rtp_jpeg_pay_read_sof (GstRtpJPEGPay * pay, const guint8 * data, /* the other components are free to use any quant table but they have to * have the same table id */ - if (info[1].qt != info[2].qt) - goto invalid_comp; + if (info[1].qt != info[2].qt) { + /* Some MJPG (like the one from the Logitech C-920 camera) uses different + * quant tables for component 1 and 2 but both tables contain the exact + * same data, so we could consider them as being the same tables */ + if (!(info[1].qt < tables_elements && + info[2].qt < tables_elements && + tables[info[1].qt].size > 0 && + tables[info[1].qt].size == tables[info[2].qt].size && + memcmp (tables[info[1].qt].data, tables[info[2].qt].data, + tables[info[1].qt].size) == 0)) + goto invalid_comp; + } return TRUE; @@ -648,7 +659,8 @@ gst_rtp_jpeg_pay_handle_buffer (GstRTPBasePayload * basepayload, offset += gst_rtp_jpeg_pay_header_size (data, offset); break; case JPEG_MARKER_SOF: - if (!gst_rtp_jpeg_pay_read_sof (pay, data, size, &offset, info)) + if (!gst_rtp_jpeg_pay_read_sof (pay, data, size, &offset, info, tables, + G_N_ELEMENTS (tables))) goto invalid_format; sof_found = TRUE; break;