[Libva] [PATCH] JPEG Encode: Added support for UYVY/YUY2/Y8 Input formats

Xiang, Haihao haihao.xiang at intel.com
Sat Dec 13 06:24:25 PST 2014


Applied.

Thanks
Haihao


>-----Original Message-----
>From: Libva [mailto:libva-bounces at lists.freedesktop.org] On Behalf Of Sirisha
>Muppavarapu
>Sent: Wednesday, December 10, 2014 5:07 AM
>To: libva at lists.freedesktop.org
>Subject: [Libva] [PATCH] JPEG Encode: Added support for UYVY/YUY2/Y8
>Input formats
>
>---
> src/gen8_mfc.c         |  11 ++--
> src/i965_device_info.c |   2 +-
> src/i965_encoder.c     | 147
>++++++++++++++++++++++++++++++++++++++++++++++---
> 3 files changed, 147 insertions(+), 13 deletions(-)
>
>diff --git a/src/gen8_mfc.c b/src/gen8_mfc.c index ca37b06..b596020 100644
>--- a/src/gen8_mfc.c
>+++ b/src/gen8_mfc.c
>@@ -70,7 +70,7 @@ static const uint32_t zigzag_direct[64] = {
>
> //Default Luminance quantization table
> //Source: Jpeg Spec ISO/IEC 10918-1, Annex K, Table K.1 -uint8_t
>jpeg_luma_quant[64] = {
>+static const uint8_t jpeg_luma_quant[64] = {
>     16, 11, 10, 16, 24,  40,  51,  61,
>     12, 12, 14, 19, 26,  58,  60,  55,
>     14, 13, 16, 24, 40,  57,  69,  56,
>@@ -83,7 +83,7 @@ uint8_t jpeg_luma_quant[64] = {
>
> //Default Chroma quantization table
> //Source: Jpeg Spec ISO/IEC 10918-1, Annex K, Table K.2 -uint8_t
>jpeg_chroma_quant[64] = {
>+static const uint8_t jpeg_chroma_quant[64] = {
>     17, 18, 24, 47, 99, 99, 99, 99,
>     18, 21, 26, 66, 99, 99, 99, 99,
>     24, 26, 56, 99, 99, 99, 99, 99,
>@@ -2498,7 +2498,8 @@
>gen8_mfc_jpeg_set_surface_state(VADriverContextP ctx,
>             surface_format = MFX_SURFACE_YCRCB_NORMAL;
>             break;
>         }
>-        case VA_FOURCC_RGBA: {
>+        case VA_FOURCC_RGBA:
>+        case VA_FOURCC_444P: {
>             surface_format = MFX_SURFACE_R8G8B8A8_UNORM;
>             break;
>         }
>@@ -2576,6 +2577,8 @@ gen8_mfc_jpeg_pic_state(VADriverContextP ctx,
>             output_mcu_format = JPEG_ENC_MCU_YUV422H_2Y;
>             break;
>         }
>+
>+        case VA_FOURCC_RGBA:
>         case VA_FOURCC_444P: {
>             input_surface_format = JPEG_ENC_SURFACE_RGB;
>             output_mcu_format = JPEG_ENC_MCU_RGB; @@ -2703,7 +2706,6 @@
>gen8_mfc_jpeg_fqm_state(VADriverContextP ctx,
>
>     } else {
>         //If the app doesnt send the qmatrix, use the buffered/default qmatrix
>-        printf("App didnt send any qmatrix, using default....\n");
>         qmatrix = &mfc_context->buffered_qmatrix;
>         qmatrix->load_lum_quantiser_matrix = 1;
>         qmatrix->load_chroma_quantiser_matrix = (pic_param-
>>num_components > 1) ? 1 : 0; @@ -2978,6 +2980,7 @@ static void
>get_Y_sampling_factors(uint32_t surface_format, uint8_t *h_factor, u
>             (* v_factor) = 1;
>             break;
>         }
>+        case VA_FOURCC_RGBA:
>         case VA_FOURCC_444P: {
>             (* h_factor) = 1;
>             (* v_factor) = 1;
>diff --git a/src/i965_device_info.c b/src/i965_device_info.c index
>9547360..52d6f37 100755
>--- a/src/i965_device_info.c
>+++ b/src/i965_device_info.c
>@@ -43,7 +43,7 @@
>
> /* Extra set of chroma formats supported for JPEG encoding (beyond YUV
>4:2:0) */  #define EXTRA_JPEG_ENC_CHROMA_FORMATS \
>-    (VA_RT_FORMAT_YUV400| VA_RT_FORMAT_YUV422 |
>VA_RT_FORMAT_YUV444)
>+    (VA_RT_FORMAT_YUV400| VA_RT_FORMAT_YUV422 |
>VA_RT_FORMAT_YUV444 | VA_RT_FORMAT_RGB32)
>
> /* Defines VA profile as a 32-bit unsigned integer mask */  #define
>VA_PROFILE_MASK(PROFILE) \ diff --git a/src/i965_encoder.c
>b/src/i965_encoder.c index e10f58d..a9bc8fa 100644
>--- a/src/i965_encoder.c
>+++ b/src/i965_encoder.c
>@@ -105,7 +105,7 @@ intel_encoder_check_yuv_surface(VADriverContextP
>ctx,
>     encode_state->input_yuv_object = obj_surface;
>     assert(obj_surface);
>     i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC_NV12,
>SUBSAMPLE_YUV420);
>-
>+
>     dst_surface.base = (struct object_base *)obj_surface;
>     dst_surface.type = I965_SURFACE_TYPE_SURFACE;
>     dst_surface.flags = I965_SURFACE_FLAG_FRAME; @@ -122,6 +122,131 @@
>intel_encoder_check_yuv_surface(VADriverContextP ctx,
>     return VA_STATUS_SUCCESS;
> }
>
>+
>+static VAStatus
>+intel_encoder_check_jpeg_yuv_surface(VADriverContextP ctx,
>+                                VAProfile profile,
>+                                struct encode_state *encode_state,
>+                                struct intel_encoder_context
>+*encoder_context) {
>+    struct i965_driver_data *i965 = i965_driver_data(ctx);
>+    struct i965_surface src_surface, dst_surface;
>+    struct object_surface *obj_surface;
>+    VAStatus status;
>+    VARectangle rect;
>+    int format=0, fourcc=0, subsample=0;
>+
>+    /* releae the temporary surface */
>+    if (encoder_context->is_tmp_id) {
>+        i965_DestroySurfaces(ctx, &encoder_context->input_yuv_surface, 1);
>+        encode_state->input_yuv_object = NULL;
>+    }
>+
>+    encoder_context->is_tmp_id = 0;
>+    obj_surface = SURFACE(encode_state->current_render_target);
>+    assert(obj_surface && obj_surface->bo);
>+
>+    if (!obj_surface || !obj_surface->bo)
>+        return VA_STATUS_ERROR_INVALID_PARAMETER;
>+
>+    unsigned int tiling = 0, swizzle = 0;
>+
>+    dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle);
>+
>+    if (tiling == I915_TILING_Y) {
>+        if( (obj_surface->fourcc==VA_FOURCC_NV12)  || (obj_surface-
>>fourcc==VA_FOURCC_UYVY) ||
>+            (obj_surface->fourcc==VA_FOURCC_YUY2)  || (obj_surface-
>>fourcc==VA_FOURCC_Y800) ||
>+            (obj_surface->fourcc==VA_FOURCC_RGBA)  || (obj_surface-
>>fourcc==VA_FOURCC_444P) ) {
>+            encoder_context->input_yuv_surface = encode_state-
>>current_render_target;
>+            encode_state->input_yuv_object = obj_surface;
>+            return VA_STATUS_SUCCESS;
>+        }
>+    }
>+
>+    rect.x = 0;
>+    rect.y = 0;
>+    rect.width = obj_surface->orig_width;
>+    rect.height = obj_surface->orig_height;
>+
>+    src_surface.base = (struct object_base *)obj_surface;
>+    src_surface.type = I965_SURFACE_TYPE_SURFACE;
>+    src_surface.flags = I965_SURFACE_FLAG_FRAME;
>+
>+    switch( obj_surface->fourcc) {
>+
>+        case VA_FOURCC_YUY2:
>+            fourcc = VA_FOURCC_YUY2;
>+            format = VA_RT_FORMAT_YUV422;
>+            subsample = SUBSAMPLE_YUV422H;
>+            break;
>+
>+        case VA_FOURCC_UYVY:
>+            fourcc = VA_FOURCC_UYVY;
>+            format = VA_RT_FORMAT_YUV422;
>+            subsample = SUBSAMPLE_YUV422H;
>+            break;
>+
>+        case VA_FOURCC_Y800:
>+            fourcc = VA_FOURCC_Y800;
>+            format = VA_RT_FORMAT_YUV400;
>+            subsample = SUBSAMPLE_YUV400;
>+            break;
>+
>+        case VA_FOURCC_444P:
>+            fourcc = VA_FOURCC_444P;
>+            format = VA_RT_FORMAT_YUV444;
>+            subsample = SUBSAMPLE_YUV444;
>+            break;
>+
>+        case VA_FOURCC_RGBA:
>+            fourcc = VA_FOURCC_RGBA;
>+            format = VA_RT_FORMAT_RGB32;
>+            subsample = SUBSAMPLE_RGBX;
>+            break;
>+
>+        default: //All other scenarios will have NV12 format
>+            fourcc = VA_FOURCC_NV12;
>+            format = VA_RT_FORMAT_YUV420;
>+            subsample = SUBSAMPLE_YUV420;
>+            break;
>+    }
>+
>+    status = i965_CreateSurfaces(ctx,
>+                                 obj_surface->orig_width,
>+                                 obj_surface->orig_height,
>+                                 format,
>+                                 1,
>+                                 &encoder_context->input_yuv_surface);
>+    assert(status == VA_STATUS_SUCCESS);
>+
>+    if (status != VA_STATUS_SUCCESS)
>+        return status;
>+
>+    obj_surface = SURFACE(encoder_context->input_yuv_surface);
>+    encode_state->input_yuv_object = obj_surface;
>+    assert(obj_surface);
>+    i965_check_alloc_surface_bo(ctx, obj_surface, 1, fourcc,
>+ subsample);
>+
>+    dst_surface.base = (struct object_base *)obj_surface;
>+    dst_surface.type = I965_SURFACE_TYPE_SURFACE;
>+    dst_surface.flags = I965_SURFACE_FLAG_FRAME;
>+
>+    //The Y800 format is expected to be tiled.
>+    //Linear Y800 is a corner case and needs code in the
>i965_image_processing.
>+    if(obj_surface->fourcc != VA_FOURCC_Y800){
>+        status = i965_image_processing(ctx,
>+                                   &src_surface,
>+                                   &rect,
>+                                   &dst_surface,
>+                                   &rect);
>+        assert(status == VA_STATUS_SUCCESS);
>+    }
>+
>+    encoder_context->is_tmp_id = 1;
>+
>+    return VA_STATUS_SUCCESS;
>+}
>+
> static VAStatus
> intel_encoder_check_misc_parameter(VADriverContextP ctx,
>                                   struct encode_state *encode_state, @@ -309,17 +434,28
>@@ intel_encoder_sanity_check_input(VADriverContextP ctx,
>     case VAProfileH264Main:
>     case VAProfileH264High:
>     case VAProfileH264MultiviewHigh:
>-    case VAProfileH264StereoHigh:
>+    case VAProfileH264StereoHigh: {
>         vaStatus = intel_encoder_check_avc_parameter(ctx, encode_state,
>encoder_context);
>+        if (vaStatus != VA_STATUS_SUCCESS)
>+            goto out;
>+        vaStatus = intel_encoder_check_yuv_surface(ctx, profile,
>+ encode_state, encoder_context);
>         break;
>+    }
>
>     case VAProfileMPEG2Simple:
>-    case VAProfileMPEG2Main:
>+    case VAProfileMPEG2Main: {
>         vaStatus = intel_encoder_check_mpeg2_parameter(ctx, encode_state,
>encoder_context);
>+        if (vaStatus != VA_STATUS_SUCCESS)
>+            goto out;
>+        vaStatus = intel_encoder_check_yuv_surface(ctx, profile,
>+ encode_state, encoder_context);
>         break;
>+    }
>
>     case VAProfileJPEGBaseline:  {
>         vaStatus = intel_encoder_check_jpeg_parameter(ctx, encode_state,
>encoder_context);
>+        if (vaStatus != VA_STATUS_SUCCESS)
>+            goto out;
>+        vaStatus = intel_encoder_check_jpeg_yuv_surface(ctx, profile,
>+ encode_state, encoder_context);
>         break;
>     }
>
>@@ -328,11 +464,6 @@
>intel_encoder_sanity_check_input(VADriverContextP ctx,
>         break;
>     }
>
>-    if (vaStatus != VA_STATUS_SUCCESS)
>-        goto out;
>-
>-    vaStatus = intel_encoder_check_yuv_surface(ctx, profile, encode_state,
>encoder_context);
>-
>     if (vaStatus == VA_STATUS_SUCCESS)
>         vaStatus = intel_encoder_check_misc_parameter(ctx, encode_state,
>encoder_context);
>
>--
>2.1.0
>
>_______________________________________________
>Libva mailing list
>Libva at lists.freedesktop.org
>http://lists.freedesktop.org/mailman/listinfo/libva


More information about the Libva mailing list