Applied. Thanks Haihao
>-----Original Message----- >From: Libva [mailto:[email protected]] On Behalf Of Sirisha >Muppavarapu >Sent: Wednesday, December 10, 2014 5:07 AM >To: [email protected] >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 >[email protected] >http://lists.freedesktop.org/mailman/listinfo/libva _______________________________________________ Libva mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libva
