diff options
author | Haihao Xiang <haihao.xiang@intel.com> | 2019-11-25 14:16:30 +0800 |
---|---|---|
committer | GStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2020-03-17 16:10:06 +0000 |
commit | 61516dd5e19a13ef6790795e6ab496be935be338 (patch) | |
tree | 07d5fccecd69dd55e98ffc26c426bb66ddff3e7a /gst-libs | |
parent | bb380557458a05774ccd22ba93fb7b24b50a61d9 (diff) |
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.
Diffstat (limited to 'gst-libs')
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapidisplay.c | 1 | ||||
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapidisplay.h | 3 | ||||
-rw-r--r-- | 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 ca235d94..092885a3 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 0d0a1492..ef94f741 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 4c87a8aa..8eda7630 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; } |