From 61516dd5e19a13ef6790795e6ab496be935be338 Mon Sep 17 00:00:00 2001 From: Haihao Xiang Date: Mon, 25 Nov 2019 14:16:30 +0800 Subject: [PATCH] vaapijpegenc: Add a quantization quirk for iHD driver iHD driver shifts the value by 50 when calculating quantization for JPEG encoding, so we should add 50 in this plugin for iHD driver too. --- gst-libs/gst/vaapi/gstvaapidisplay.c | 1 + gst-libs/gst/vaapi/gstvaapidisplay.h | 3 +++ gst-libs/gst/vaapi/gstvaapiencoder_jpeg.c | 28 +++++++++++++++++++---- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/gst-libs/gst/vaapi/gstvaapidisplay.c b/gst-libs/gst/vaapi/gstvaapidisplay.c index ca235d943c..092885a394 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay.c +++ b/gst-libs/gst/vaapi/gstvaapidisplay.c @@ -806,6 +806,7 @@ set_driver_quirks (GstVaapiDisplay * display) { "i965", GST_VAAPI_DRIVER_QUIRK_NO_CHECK_VPP_COLOR_STD }, { "iHD", GST_VAAPI_DRIVER_QUIRK_NO_RGBYUV_VPP_COLOR_PRIMARY }, { "i965", GST_VAAPI_DRIVER_QUIRK_MISSING_RGBA_IMAGE_FORMAT }, + { "iHD", GST_VAAPI_DRIVER_QUIRK_JPEG_ENC_SHIFT_VALUE_BY_50 }, }; /* *INDENT-ON* */ diff --git a/gst-libs/gst/vaapi/gstvaapidisplay.h b/gst-libs/gst/vaapi/gstvaapidisplay.h index 0d0a1492fe..ef94f741da 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay.h +++ b/gst-libs/gst/vaapi/gstvaapidisplay.h @@ -105,6 +105,8 @@ typedef struct _GstVaapiDisplay GstVaapiDisplay; * report to support ARGB format, but if it's forced to create a RGBA * surface, it works. Driver issue: * https://github.com/intel/intel-vaapi-driver/issues/500 + * @GST_VAAPI_DRIVER_QUIRK_JPEG_ENC_SHIFT_VALUE_BY_50: if the driver shifts + * the value by 50 when calculating quantization from quality level */ typedef enum { @@ -112,6 +114,7 @@ typedef enum GST_VAAPI_DRIVER_QUIRK_NO_CHECK_VPP_COLOR_STD = (1U << 1), GST_VAAPI_DRIVER_QUIRK_NO_RGBYUV_VPP_COLOR_PRIMARY = (1U << 2), GST_VAAPI_DRIVER_QUIRK_MISSING_RGBA_IMAGE_FORMAT = (1U << 3), + GST_VAAPI_DRIVER_QUIRK_JPEG_ENC_SHIFT_VALUE_BY_50 = (1U << 4), } GstVaapiDriverQuirks; /** diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_jpeg.c b/gst-libs/gst/vaapi/gstvaapiencoder_jpeg.c index 4c87a8aa38..8eda7630a4 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_jpeg.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_jpeg.c @@ -255,7 +255,7 @@ ensure_picture (GstVaapiEncoderJpeg * encoder, GstVaapiEncPicture * picture, * is scaling the QM values using the normalized quality factor */ static void generate_scaled_qm (GstJpegQuantTables * quant_tables, - GstJpegQuantTables * scaled_quant_tables, guint quality) + GstJpegQuantTables * scaled_quant_tables, guint quality, guint shift) { guint qt_val, nm_quality, i; nm_quality = quality == 0 ? 1 : quality; @@ -267,11 +267,15 @@ generate_scaled_qm (GstJpegQuantTables * quant_tables, for (i = 0; i < GST_JPEG_MAX_QUANT_ELEMENTS; i++) { /* Luma QM */ - qt_val = (quant_tables->quant_tables[0].quant_table[i] * nm_quality) / 100; + qt_val = + (quant_tables->quant_tables[0].quant_table[i] * nm_quality + + shift) / 100; scaled_quant_tables->quant_tables[0].quant_table[i] = CLAMP (qt_val, 1, 255); /* Chroma QM */ - qt_val = (quant_tables->quant_tables[1].quant_table[i] * nm_quality) / 100; + qt_val = + (quant_tables->quant_tables[1].quant_table[i] * nm_quality + + shift) / 100; scaled_quant_tables->quant_tables[1].quant_table[i] = CLAMP (qt_val, 1, 255); } @@ -294,10 +298,17 @@ fill_quantization_table (GstVaapiEncoderJpeg * encoder, q_matrix = picture->q_matrix->param; if (!encoder->has_quant_tables) { + GstVaapiDisplay *const display = GST_VAAPI_ENCODER_DISPLAY (encoder); + guint shift = 0; + + if (gst_vaapi_display_has_driver_quirks (display, + GST_VAAPI_DRIVER_QUIRK_JPEG_ENC_SHIFT_VALUE_BY_50)) + shift = 50; + gst_jpeg_get_default_quantization_tables (&encoder->quant_tables); encoder->has_quant_tables = TRUE; generate_scaled_qm (&encoder->quant_tables, &encoder->scaled_quant_tables, - encoder->quality); + encoder->quality, shift); } q_matrix->load_lum_quantiser_matrix = 1; for (i = 0; i < GST_JPEG_MAX_QUANT_ELEMENTS; i++) { @@ -507,9 +518,16 @@ bs_write_jpeg_header (GstBitWriter * bs, GstVaapiEncoderJpeg * encoder, /* Add quantization table */ if (!encoder->has_quant_tables) { + GstVaapiDisplay *const display = GST_VAAPI_ENCODER_DISPLAY (encoder); + guint shift = 0; + + if (gst_vaapi_display_has_driver_quirks (display, + GST_VAAPI_DRIVER_QUIRK_JPEG_ENC_SHIFT_VALUE_BY_50)) + shift = 50; + gst_jpeg_get_default_quantization_tables (&encoder->quant_tables); generate_scaled_qm (&encoder->quant_tables, &encoder->scaled_quant_tables, - encoder->quality); + encoder->quality, shift); encoder->has_quant_tables = TRUE; }