2 * Copyright @ 2017 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWAR OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 * Pengfei Qu <Pengfei.qu@intel.com>
37 #include "intel_batchbuffer.h"
38 #include "intel_driver.h"
40 #include "i965_defines.h"
41 #include "i965_structs.h"
42 #include "i965_drv_video.h"
43 #include "i965_encoder.h"
44 #include "i965_encoder_utils.h"
45 #include "intel_media.h"
47 #include "i965_gpe_utils.h"
48 #include "i965_encoder_common.h"
49 #include "i965_avc_encoder_common.h"
50 #include "gen9_avc_encoder_kernels.h"
51 #include "gen9_avc_encoder.h"
52 #include "gen9_avc_const_def.h"
54 #define MAX_URB_SIZE 4096 /* In register */
55 #define NUM_KERNELS_PER_GPE_CONTEXT 1
56 #define MBENC_KERNEL_BASE GEN9_AVC_KERNEL_MBENC_QUALITY_I
57 #define GPE_RESOURCE_ALIGNMENT 4 /* 4 means 16 = 1 << 4) */
59 #define OUT_BUFFER_2DW(batch, bo, is_target, delta) do { \
61 OUT_BCS_RELOC64(batch, \
63 I915_GEM_DOMAIN_INSTRUCTION, \
64 is_target ? I915_GEM_DOMAIN_RENDER : 0, \
67 OUT_BCS_BATCH(batch, 0); \
68 OUT_BCS_BATCH(batch, 0); \
72 #define OUT_BUFFER_3DW(batch, bo, is_target, delta, attr) do { \
73 OUT_BUFFER_2DW(batch, bo, is_target, delta); \
74 OUT_BCS_BATCH(batch, attr); \
77 static const uint32_t qm_flat[16] = {
78 0x10101010, 0x10101010, 0x10101010, 0x10101010,
79 0x10101010, 0x10101010, 0x10101010, 0x10101010,
80 0x10101010, 0x10101010, 0x10101010, 0x10101010,
81 0x10101010, 0x10101010, 0x10101010, 0x10101010
84 static const uint32_t fqm_flat[32] = {
85 0x10001000, 0x10001000, 0x10001000, 0x10001000,
86 0x10001000, 0x10001000, 0x10001000, 0x10001000,
87 0x10001000, 0x10001000, 0x10001000, 0x10001000,
88 0x10001000, 0x10001000, 0x10001000, 0x10001000,
89 0x10001000, 0x10001000, 0x10001000, 0x10001000,
90 0x10001000, 0x10001000, 0x10001000, 0x10001000,
91 0x10001000, 0x10001000, 0x10001000, 0x10001000,
92 0x10001000, 0x10001000, 0x10001000, 0x10001000
95 static const unsigned int slice_type_kernel[3] = {1,2,0};
97 static const gen9_avc_brc_init_reset_curbe_data gen9_avc_brc_init_reset_curbe_init_data =
255 static const gen9_avc_frame_brc_update_curbe_data gen9_avc_frame_brc_update_curbe_init_data =
414 gen9_avc_update_misc_parameters(VADriverContextP ctx,
415 struct encode_state *encode_state,
416 struct intel_encoder_context *encoder_context)
418 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
419 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
423 generic_state->max_bit_rate = (encoder_context->brc.bits_per_second[0] + 1000 - 1) / 1000;
425 generic_state->brc_need_reset = encoder_context->brc.need_reset;
427 if (generic_state->internal_rate_mode == VA_RC_CBR) {
428 generic_state->min_bit_rate = generic_state->max_bit_rate;
429 generic_state->mb_brc_enabled = encoder_context->brc.mb_rate_control[0];
431 if (generic_state->target_bit_rate != generic_state->max_bit_rate) {
432 generic_state->target_bit_rate = generic_state->max_bit_rate;
433 generic_state->brc_need_reset = 1;
435 } else if (generic_state->internal_rate_mode == VA_RC_VBR) {
436 generic_state->min_bit_rate = generic_state->max_bit_rate * (2 * encoder_context->brc.target_percentage[0] - 100) / 100;
437 generic_state->mb_brc_enabled = encoder_context->brc.mb_rate_control[0];
439 if (generic_state->target_bit_rate != generic_state->max_bit_rate * encoder_context->brc.target_percentage[0] / 100) {
440 generic_state->target_bit_rate = generic_state->max_bit_rate * encoder_context->brc.target_percentage[0] / 100;
441 generic_state->brc_need_reset = 1;
446 if (generic_state->internal_rate_mode != VA_RC_CQP)
448 generic_state->frames_per_100s = encoder_context->brc.framerate[0].num * 100/encoder_context->brc.framerate[0].den ;
449 generic_state->frame_rate = encoder_context->brc.framerate[0].num/encoder_context->brc.framerate[0].den ;
450 generic_state->frames_per_window_size = (int)(encoder_context->brc.window_size * generic_state->frame_rate /1000);// brc.windows size in ms as the unit
453 generic_state->frames_per_100s = 30 * 100;
454 generic_state->frame_rate = 30 ;
455 generic_state->frames_per_window_size = 30;
459 if (generic_state->internal_rate_mode != VA_RC_CQP)
461 generic_state->vbv_buffer_size_in_bit = encoder_context->brc.hrd_buffer_size;//misc->buffer_size;
462 generic_state->init_vbv_buffer_fullness_in_bit = encoder_context->brc.hrd_initial_buffer_fullness;//misc->initial_buffer_fullness;
466 generic_state->num_roi = MIN(encoder_context->brc.num_roi, 3);
467 if (generic_state->num_roi > 0) {
468 generic_state->max_delta_qp = encoder_context->brc.roi_max_delta_qp;
469 generic_state->min_delta_qp = encoder_context->brc.roi_min_delta_qp;
471 for (i = 0; i < generic_state->num_roi; i++) {
472 generic_state->roi[i].left = encoder_context->brc.roi[i].left;
473 generic_state->roi[i].right = encoder_context->brc.roi[i].right;
474 generic_state->roi[i].top = encoder_context->brc.roi[i].top;
475 generic_state->roi[i].bottom = encoder_context->brc.roi[i].bottom;
476 generic_state->roi[i].value = encoder_context->brc.roi[i].value;
478 generic_state->roi[i].left /= 16;
479 generic_state->roi[i].right /= 16;
480 generic_state->roi[i].top /= 16;
481 generic_state->roi[i].bottom /= 16;
488 intel_avc_get_kernel_header_and_size(void *pvbinary,
490 INTEL_GENERIC_ENC_OPERATION operation,
492 struct i965_kernel *ret_kernel)
494 typedef uint32_t BIN_PTR[4];
497 gen9_avc_encoder_kernel_header *pkh_table;
498 kernel_header *pcurr_header, *pinvalid_entry, *pnext_header;
501 if (!pvbinary || !ret_kernel)
504 bin_start = (char *)pvbinary;
505 pkh_table = (gen9_avc_encoder_kernel_header *)pvbinary;
506 pinvalid_entry = &(pkh_table->static_detection) + 1;
507 next_krnoffset = binary_size;
509 if (operation == INTEL_GENERIC_ENC_SCALING4X)
511 pcurr_header = &pkh_table->ply_dscale_ply;
513 else if (operation == INTEL_GENERIC_ENC_SCALING2X)
515 pcurr_header = &pkh_table->ply_2xdscale_ply;
517 else if (operation == INTEL_GENERIC_ENC_ME)
519 pcurr_header = &pkh_table->me_p;
521 else if (operation == INTEL_GENERIC_ENC_BRC)
523 pcurr_header = &pkh_table->frame_brc_init;
525 else if (operation == INTEL_GENERIC_ENC_MBENC)
527 pcurr_header = &pkh_table->mbenc_quality_I;
529 else if (operation == INTEL_GENERIC_ENC_WP)
531 pcurr_header = &pkh_table->wp;
533 else if (operation == INTEL_GENERIC_ENC_SFD)
535 pcurr_header = &pkh_table->static_detection;
542 pcurr_header += krnstate_idx;
543 ret_kernel->bin = (const BIN_PTR *)(bin_start + (pcurr_header->kernel_start_pointer << 6));
545 pnext_header = (pcurr_header + 1);
546 if (pnext_header < pinvalid_entry)
548 next_krnoffset = pnext_header->kernel_start_pointer << 6;
550 ret_kernel->size = next_krnoffset - (pcurr_header->kernel_start_pointer << 6);
555 gen9_free_surfaces_avc(void **data)
557 struct gen9_surface_avc *avc_surface;
564 if (avc_surface->scaled_4x_surface_obj) {
565 i965_DestroySurfaces(avc_surface->ctx, &avc_surface->scaled_4x_surface_id, 1);
566 avc_surface->scaled_4x_surface_id = VA_INVALID_SURFACE;
567 avc_surface->scaled_4x_surface_obj = NULL;
570 if (avc_surface->scaled_16x_surface_obj) {
571 i965_DestroySurfaces(avc_surface->ctx, &avc_surface->scaled_16x_surface_id, 1);
572 avc_surface->scaled_16x_surface_id = VA_INVALID_SURFACE;
573 avc_surface->scaled_16x_surface_obj = NULL;
576 if (avc_surface->scaled_32x_surface_obj) {
577 i965_DestroySurfaces(avc_surface->ctx, &avc_surface->scaled_32x_surface_id, 1);
578 avc_surface->scaled_32x_surface_id = VA_INVALID_SURFACE;
579 avc_surface->scaled_32x_surface_obj = NULL;
582 i965_free_gpe_resource(&avc_surface->res_mb_code_surface);
583 i965_free_gpe_resource(&avc_surface->res_mv_data_surface);
584 i965_free_gpe_resource(&avc_surface->res_ref_pic_select_surface);
586 dri_bo_unreference(avc_surface->dmv_top);
587 avc_surface->dmv_top = NULL;
588 dri_bo_unreference(avc_surface->dmv_bottom);
589 avc_surface->dmv_bottom = NULL;
599 gen9_avc_init_check_surfaces(VADriverContextP ctx,
600 struct object_surface *obj_surface,
601 struct intel_encoder_context *encoder_context,
602 struct avc_surface_param *surface_param)
604 struct i965_driver_data *i965 = i965_driver_data(ctx);
605 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
606 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
607 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
609 struct gen9_surface_avc *avc_surface;
610 int downscaled_width_4x, downscaled_height_4x;
611 int downscaled_width_16x, downscaled_height_16x;
612 int downscaled_width_32x, downscaled_height_32x;
614 unsigned int frame_width_in_mbs = ALIGN(surface_param->frame_width,16) / 16;
615 unsigned int frame_height_in_mbs = ALIGN(surface_param->frame_height,16) / 16;
616 unsigned int frame_mb_nums = frame_width_in_mbs * frame_height_in_mbs;
617 int allocate_flag = 1;
620 if (!obj_surface || !obj_surface->bo)
621 return VA_STATUS_ERROR_INVALID_SURFACE;
623 if (obj_surface->private_data) {
624 return VA_STATUS_SUCCESS;
627 avc_surface = calloc(1, sizeof(struct gen9_surface_avc));
630 return VA_STATUS_ERROR_ALLOCATION_FAILED;
632 avc_surface->ctx = ctx;
633 obj_surface->private_data = avc_surface;
634 obj_surface->free_private_data = gen9_free_surfaces_avc;
636 downscaled_width_4x = generic_state->frame_width_4x;
637 downscaled_height_4x = generic_state->frame_height_4x;
639 i965_CreateSurfaces(ctx,
641 downscaled_height_4x,
644 &avc_surface->scaled_4x_surface_id);
646 avc_surface->scaled_4x_surface_obj = SURFACE(avc_surface->scaled_4x_surface_id);
648 if (!avc_surface->scaled_4x_surface_obj) {
649 return VA_STATUS_ERROR_ALLOCATION_FAILED;
652 i965_check_alloc_surface_bo(ctx, avc_surface->scaled_4x_surface_obj, 1,
653 VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
655 downscaled_width_16x = generic_state->frame_width_16x;
656 downscaled_height_16x = generic_state->frame_height_16x;
657 i965_CreateSurfaces(ctx,
658 downscaled_width_16x,
659 downscaled_height_16x,
662 &avc_surface->scaled_16x_surface_id);
663 avc_surface->scaled_16x_surface_obj = SURFACE(avc_surface->scaled_16x_surface_id);
665 if (!avc_surface->scaled_16x_surface_obj) {
666 return VA_STATUS_ERROR_ALLOCATION_FAILED;
669 i965_check_alloc_surface_bo(ctx, avc_surface->scaled_16x_surface_obj, 1,
670 VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
672 if(generic_state->b32xme_supported ||
673 generic_state->b32xme_enabled)
675 downscaled_width_32x = generic_state->frame_width_32x;
676 downscaled_height_32x = generic_state->frame_height_32x;
677 i965_CreateSurfaces(ctx,
678 downscaled_width_32x,
679 downscaled_height_32x,
682 &avc_surface->scaled_32x_surface_id);
683 avc_surface->scaled_32x_surface_obj = SURFACE(avc_surface->scaled_32x_surface_id);
685 if (!avc_surface->scaled_32x_surface_obj) {
686 return VA_STATUS_ERROR_ALLOCATION_FAILED;
689 i965_check_alloc_surface_bo(ctx, avc_surface->scaled_32x_surface_obj, 1,
690 VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
693 /*mb code and mv data for each frame*/
694 size = frame_mb_nums * 16 * 4;
695 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
696 &avc_surface->res_mb_code_surface,
700 goto failed_allocation;
702 size = frame_mb_nums * 32 * 4;
703 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
704 &avc_surface->res_mv_data_surface,
708 goto failed_allocation;
711 if(avc_state->ref_pic_select_list_supported)
713 width = ALIGN(frame_width_in_mbs * 8,64);
714 height= frame_height_in_mbs ;
715 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
716 &avc_surface->res_ref_pic_select_surface,
719 "Ref pic select list buffer");
721 goto failed_allocation;
725 avc_surface->dmv_top =
726 dri_bo_alloc(i965->intel.bufmgr,
727 "direct mv top Buffer",
730 avc_surface->dmv_bottom =
731 dri_bo_alloc(i965->intel.bufmgr,
732 "direct mv bottom Buffer",
735 assert(avc_surface->dmv_top);
736 assert(avc_surface->dmv_bottom);
738 return VA_STATUS_SUCCESS;
741 return VA_STATUS_ERROR_ALLOCATION_FAILED;
745 gen9_avc_allocate_resources(VADriverContextP ctx,
746 struct encode_state *encode_state,
747 struct intel_encoder_context *encoder_context)
749 struct i965_driver_data *i965 = i965_driver_data(ctx);
750 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
751 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
752 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
753 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
754 unsigned int size = 0;
755 unsigned int width = 0;
756 unsigned int height = 0;
757 unsigned char * data = NULL;
758 int allocate_flag = 1;
761 /*all the surface/buffer are allocated here*/
763 /*second level batch buffer for image state write when cqp etc*/
764 i965_free_gpe_resource(&avc_ctx->res_image_state_batch_buffer_2nd_level);
765 size = INTEL_AVC_IMAGE_STATE_CMD_SIZE ;
766 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
767 &avc_ctx->res_image_state_batch_buffer_2nd_level,
769 "second levle batch (image state write) buffer");
771 goto failed_allocation;
773 /* scaling related surface */
774 if(avc_state->mb_status_supported)
776 i965_free_gpe_resource(&avc_ctx->res_mb_status_buffer);
777 size = (generic_state->frame_width_in_mbs * generic_state->frame_height_in_mbs * 16 * 4 + 1023)&~0x3ff;
778 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
779 &avc_ctx->res_mb_status_buffer,
781 "MB statistics output buffer");
783 goto failed_allocation;
784 i965_zero_gpe_resource(&avc_ctx->res_mb_status_buffer);
787 if(avc_state->flatness_check_supported)
789 width = generic_state->frame_width_in_mbs * 4;
790 height= generic_state->frame_height_in_mbs * 4;
791 i965_free_gpe_resource(&avc_ctx->res_flatness_check_surface);
792 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
793 &avc_ctx->res_flatness_check_surface,
796 "Flatness check buffer");
798 goto failed_allocation;
800 /* me related surface */
801 width = generic_state->downscaled_width_4x_in_mb * 8;
802 height= generic_state->downscaled_height_4x_in_mb * 4 * 10;
803 i965_free_gpe_resource(&avc_ctx->s4x_memv_distortion_buffer);
804 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
805 &avc_ctx->s4x_memv_distortion_buffer,
808 "4x MEMV distortion buffer");
810 goto failed_allocation;
811 i965_zero_gpe_resource(&avc_ctx->s4x_memv_distortion_buffer);
813 width = (generic_state->downscaled_width_4x_in_mb + 7)/8 * 64;
814 height= (generic_state->downscaled_height_4x_in_mb + 1)/2 * 8;
815 i965_free_gpe_resource(&avc_ctx->s4x_memv_min_distortion_brc_buffer);
816 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
817 &avc_ctx->s4x_memv_min_distortion_brc_buffer,
820 "4x MEMV min distortion brc buffer");
822 goto failed_allocation;
823 i965_zero_gpe_resource(&avc_ctx->s4x_memv_min_distortion_brc_buffer);
826 width = ALIGN(generic_state->downscaled_width_4x_in_mb * 32,64);
827 height= generic_state->downscaled_height_4x_in_mb * 4 * 2 * 10;
828 i965_free_gpe_resource(&avc_ctx->s4x_memv_data_buffer);
829 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
830 &avc_ctx->s4x_memv_data_buffer,
833 "4x MEMV data buffer");
835 goto failed_allocation;
836 i965_zero_gpe_resource(&avc_ctx->s4x_memv_data_buffer);
839 width = ALIGN(generic_state->downscaled_width_16x_in_mb * 32,64);
840 height= generic_state->downscaled_height_16x_in_mb * 4 * 2 * 10 ;
841 i965_free_gpe_resource(&avc_ctx->s16x_memv_data_buffer);
842 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
843 &avc_ctx->s16x_memv_data_buffer,
846 "16x MEMV data buffer");
848 goto failed_allocation;
849 i965_zero_gpe_resource(&avc_ctx->s16x_memv_data_buffer);
852 width = ALIGN(generic_state->downscaled_width_32x_in_mb * 32,64);
853 height= generic_state->downscaled_height_32x_in_mb * 4 * 2 * 10 ;
854 i965_free_gpe_resource(&avc_ctx->s32x_memv_data_buffer);
855 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
856 &avc_ctx->s32x_memv_data_buffer,
859 "32x MEMV data buffer");
861 goto failed_allocation;
862 i965_zero_gpe_resource(&avc_ctx->s32x_memv_data_buffer);
865 if(!generic_state->brc_allocated)
867 /*brc related surface */
868 i965_free_gpe_resource(&avc_ctx->res_brc_history_buffer);
870 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
871 &avc_ctx->res_brc_history_buffer,
873 "brc history buffer");
875 goto failed_allocation;
877 i965_free_gpe_resource(&avc_ctx->res_brc_pre_pak_statistics_output_buffer);
879 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
880 &avc_ctx->res_brc_pre_pak_statistics_output_buffer,
882 "brc pak statistic buffer");
884 goto failed_allocation;
886 i965_free_gpe_resource(&avc_ctx->res_brc_image_state_read_buffer);
887 size = INTEL_AVC_IMAGE_STATE_CMD_SIZE * 7;
888 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
889 &avc_ctx->res_brc_image_state_read_buffer,
891 "brc image state read buffer");
893 goto failed_allocation;
895 i965_free_gpe_resource(&avc_ctx->res_brc_image_state_write_buffer);
896 size = INTEL_AVC_IMAGE_STATE_CMD_SIZE * 7;
897 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
898 &avc_ctx->res_brc_image_state_write_buffer,
900 "brc image state write buffer");
902 goto failed_allocation;
904 width = ALIGN(64,64);
906 i965_free_gpe_resource(&avc_ctx->res_brc_const_data_buffer);
907 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
908 &avc_ctx->res_brc_const_data_buffer,
911 "brc const data buffer");
913 goto failed_allocation;
915 if(generic_state->brc_distortion_buffer_supported)
917 width = ALIGN(generic_state->downscaled_width_4x_in_mb * 8,64);
918 height= ALIGN(generic_state->downscaled_height_4x_in_mb * 4,8);
919 width = (generic_state->downscaled_width_4x_in_mb + 7)/8 * 64;
920 height= (generic_state->downscaled_height_4x_in_mb + 1)/2 * 8;
921 i965_free_gpe_resource(&avc_ctx->res_brc_dist_data_surface);
922 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
923 &avc_ctx->res_brc_dist_data_surface,
926 "brc dist data buffer");
928 goto failed_allocation;
929 i965_zero_gpe_resource(&avc_ctx->res_brc_dist_data_surface);
932 if(generic_state->brc_roi_enable)
934 width = ALIGN(generic_state->downscaled_width_4x_in_mb * 16,64);
935 height= ALIGN(generic_state->downscaled_height_4x_in_mb * 4,8);
936 i965_free_gpe_resource(&avc_ctx->res_mbbrc_roi_surface);
937 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
938 &avc_ctx->res_mbbrc_roi_surface,
943 goto failed_allocation;
944 i965_zero_gpe_resource(&avc_ctx->res_mbbrc_roi_surface);
948 width = ALIGN(generic_state->downscaled_width_4x_in_mb * 4,64);
949 height= ALIGN(generic_state->downscaled_height_4x_in_mb * 4,8);
950 i965_free_gpe_resource(&avc_ctx->res_mbbrc_mb_qp_data_surface);
951 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
952 &avc_ctx->res_mbbrc_mb_qp_data_surface,
955 "mbbrc mb qp buffer");
957 goto failed_allocation;
959 i965_free_gpe_resource(&avc_ctx->res_mbbrc_const_data_buffer);
961 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
962 &avc_ctx->res_mbbrc_const_data_buffer,
964 "mbbrc const data buffer");
966 goto failed_allocation;
968 generic_state->brc_allocated = 1;
972 if(avc_state->mb_qp_data_enable)
974 width = ALIGN(generic_state->downscaled_width_4x_in_mb * 4,64);
975 height= ALIGN(generic_state->downscaled_height_4x_in_mb * 4,8);
976 i965_free_gpe_resource(&avc_ctx->res_mb_qp_data_surface);
977 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
978 &avc_ctx->res_mb_qp_data_surface,
981 "external mb qp buffer");
983 goto failed_allocation;
986 /* mbenc related surface. it share most of surface with other kernels */
987 if(avc_state->arbitrary_num_mbs_in_slice)
989 width = (generic_state->frame_width_in_mbs + 1) * 64;
990 height= generic_state->frame_height_in_mbs ;
991 i965_free_gpe_resource(&avc_ctx->res_mbenc_slice_map_surface);
992 allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
993 &avc_ctx->res_mbenc_slice_map_surface,
998 goto failed_allocation;
1000 /*generate slice map,default one slice per frame.*/
1003 /* sfd related surface */
1004 if(avc_state->sfd_enable)
1006 i965_free_gpe_resource(&avc_ctx->res_sfd_output_buffer);
1008 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
1009 &avc_ctx->res_sfd_output_buffer,
1011 "sfd output buffer");
1013 goto failed_allocation;
1015 i965_free_gpe_resource(&avc_ctx->res_sfd_cost_table_p_frame_buffer);
1016 size = ALIGN(52,64);
1017 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
1018 &avc_ctx->res_sfd_cost_table_p_frame_buffer,
1020 "sfd P frame cost table buffer");
1022 goto failed_allocation;
1023 data = i965_map_gpe_resource(&(avc_ctx->res_sfd_cost_table_p_frame_buffer));
1025 memcpy(data,gen9_avc_sfd_cost_table_p_frame,sizeof(unsigned char) *52);
1026 i965_unmap_gpe_resource(&(avc_ctx->res_sfd_cost_table_p_frame_buffer));
1028 i965_free_gpe_resource(&avc_ctx->res_sfd_cost_table_b_frame_buffer);
1029 size = ALIGN(52,64);
1030 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
1031 &avc_ctx->res_sfd_cost_table_b_frame_buffer,
1033 "sfd B frame cost table buffer");
1035 goto failed_allocation;
1036 data = i965_map_gpe_resource(&(avc_ctx->res_sfd_cost_table_b_frame_buffer));
1038 memcpy(data,gen9_avc_sfd_cost_table_b_frame,sizeof(unsigned char) *52);
1039 i965_unmap_gpe_resource(&(avc_ctx->res_sfd_cost_table_b_frame_buffer));
1042 /* wp related surfaces */
1043 if(avc_state->weighted_prediction_supported)
1045 for(i = 0; i < 2 ; i++)
1047 if (avc_ctx->wp_output_pic_select_surface_obj[i]) {
1051 width = generic_state->frame_width_in_pixel;
1052 height= generic_state->frame_height_in_pixel ;
1053 i965_CreateSurfaces(ctx,
1056 VA_RT_FORMAT_YUV420,
1058 &avc_ctx->wp_output_pic_select_surface_id[i]);
1059 avc_ctx->wp_output_pic_select_surface_obj[i] = SURFACE(avc_ctx->wp_output_pic_select_surface_id[i]);
1061 if (!avc_ctx->wp_output_pic_select_surface_obj[i]) {
1062 goto failed_allocation;
1065 i965_check_alloc_surface_bo(ctx, avc_ctx->wp_output_pic_select_surface_obj[i], 1,
1066 VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
1068 i965_free_gpe_resource(&avc_ctx->res_wp_output_pic_select_surface_list[0]);
1069 i965_object_surface_to_2d_gpe_resource_with_align(&avc_ctx->res_wp_output_pic_select_surface_list[0], avc_ctx->wp_output_pic_select_surface_obj[0],GPE_RESOURCE_ALIGNMENT);
1070 i965_free_gpe_resource(&avc_ctx->res_wp_output_pic_select_surface_list[1]);
1071 i965_object_surface_to_2d_gpe_resource_with_align(&avc_ctx->res_wp_output_pic_select_surface_list[1], avc_ctx->wp_output_pic_select_surface_obj[1],GPE_RESOURCE_ALIGNMENT);
1076 i965_free_gpe_resource(&avc_ctx->res_mad_data_buffer);
1078 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
1079 &avc_ctx->res_mad_data_buffer,
1083 goto failed_allocation;
1085 return VA_STATUS_SUCCESS;
1088 return VA_STATUS_ERROR_ALLOCATION_FAILED;
1092 gen9_avc_free_resources(struct encoder_vme_mfc_context * vme_context)
1097 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
1098 VADriverContextP ctx = avc_ctx->ctx;
1101 /* free all the surface/buffer here*/
1102 i965_free_gpe_resource(&avc_ctx->res_image_state_batch_buffer_2nd_level);
1103 i965_free_gpe_resource(&avc_ctx->res_mb_status_buffer);
1104 i965_free_gpe_resource(&avc_ctx->res_flatness_check_surface);
1105 i965_free_gpe_resource(&avc_ctx->s4x_memv_distortion_buffer);
1106 i965_free_gpe_resource(&avc_ctx->s4x_memv_min_distortion_brc_buffer);
1107 i965_free_gpe_resource(&avc_ctx->s4x_memv_data_buffer);
1108 i965_free_gpe_resource(&avc_ctx->s16x_memv_data_buffer);
1109 i965_free_gpe_resource(&avc_ctx->s32x_memv_data_buffer);
1110 i965_free_gpe_resource(&avc_ctx->res_brc_history_buffer);
1111 i965_free_gpe_resource(&avc_ctx->res_brc_pre_pak_statistics_output_buffer);
1112 i965_free_gpe_resource(&avc_ctx->res_brc_image_state_read_buffer);
1113 i965_free_gpe_resource(&avc_ctx->res_brc_image_state_write_buffer);
1114 i965_free_gpe_resource(&avc_ctx->res_brc_const_data_buffer);
1115 i965_free_gpe_resource(&avc_ctx->res_brc_dist_data_surface);
1116 i965_free_gpe_resource(&avc_ctx->res_mbbrc_roi_surface);
1117 i965_free_gpe_resource(&avc_ctx->res_mbbrc_mb_qp_data_surface);
1118 i965_free_gpe_resource(&avc_ctx->res_mb_qp_data_surface);
1119 i965_free_gpe_resource(&avc_ctx->res_mbbrc_const_data_buffer);
1120 i965_free_gpe_resource(&avc_ctx->res_mbenc_slice_map_surface);
1121 i965_free_gpe_resource(&avc_ctx->res_sfd_output_buffer);
1122 i965_free_gpe_resource(&avc_ctx->res_sfd_cost_table_p_frame_buffer);
1123 i965_free_gpe_resource(&avc_ctx->res_sfd_cost_table_b_frame_buffer);
1124 i965_free_gpe_resource(&avc_ctx->res_wp_output_pic_select_surface_list[0]);
1125 i965_free_gpe_resource(&avc_ctx->res_wp_output_pic_select_surface_list[1]);
1126 i965_free_gpe_resource(&avc_ctx->res_mad_data_buffer);
1128 for(i = 0;i < 2 ; i++)
1130 if (avc_ctx->wp_output_pic_select_surface_obj[i]) {
1131 i965_DestroySurfaces(ctx, &avc_ctx->wp_output_pic_select_surface_id[i], 1);
1132 avc_ctx->wp_output_pic_select_surface_id[i] = VA_INVALID_SURFACE;
1133 avc_ctx->wp_output_pic_select_surface_obj[i] = NULL;
1140 gen9_avc_run_kernel_media_object(VADriverContextP ctx,
1141 struct intel_encoder_context *encoder_context,
1142 struct i965_gpe_context *gpe_context,
1144 struct gpe_media_object_parameter *param)
1146 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1147 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
1149 struct intel_batchbuffer *batch = encoder_context->base.batch;
1150 struct encoder_status_buffer_internal *status_buffer;
1151 struct gpe_mi_store_data_imm_parameter mi_store_data_imm;
1156 intel_batchbuffer_start_atomic(batch, 0x1000);
1157 intel_batchbuffer_emit_mi_flush(batch);
1159 status_buffer = &(avc_ctx->status_buffer);
1160 memset(&mi_store_data_imm, 0, sizeof(mi_store_data_imm));
1161 mi_store_data_imm.bo = status_buffer->bo;
1162 mi_store_data_imm.offset = status_buffer->media_index_offset;
1163 mi_store_data_imm.dw0 = media_function;
1164 gen8_gpe_mi_store_data_imm(ctx, batch, &mi_store_data_imm);
1166 gen9_gpe_pipeline_setup(ctx, gpe_context, batch);
1167 gen8_gpe_media_object(ctx, gpe_context, batch, param);
1168 gen8_gpe_media_state_flush(ctx, gpe_context, batch);
1170 gen9_gpe_pipeline_end(ctx, gpe_context, batch);
1172 intel_batchbuffer_end_atomic(batch);
1174 intel_batchbuffer_flush(batch);
1178 gen9_avc_run_kernel_media_object_walker(VADriverContextP ctx,
1179 struct intel_encoder_context *encoder_context,
1180 struct i965_gpe_context *gpe_context,
1182 struct gpe_media_object_walker_parameter *param)
1184 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1185 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
1187 struct intel_batchbuffer *batch = encoder_context->base.batch;
1188 struct encoder_status_buffer_internal *status_buffer;
1189 struct gpe_mi_store_data_imm_parameter mi_store_data_imm;
1194 intel_batchbuffer_start_atomic(batch, 0x1000);
1196 intel_batchbuffer_emit_mi_flush(batch);
1198 status_buffer = &(avc_ctx->status_buffer);
1199 memset(&mi_store_data_imm, 0, sizeof(mi_store_data_imm));
1200 mi_store_data_imm.bo = status_buffer->bo;
1201 mi_store_data_imm.offset = status_buffer->media_index_offset;
1202 mi_store_data_imm.dw0 = media_function;
1203 gen8_gpe_mi_store_data_imm(ctx, batch, &mi_store_data_imm);
1205 gen9_gpe_pipeline_setup(ctx, gpe_context, batch);
1206 gen8_gpe_media_object_walker(ctx, gpe_context, batch, param);
1207 gen8_gpe_media_state_flush(ctx, gpe_context, batch);
1209 gen9_gpe_pipeline_end(ctx, gpe_context, batch);
1211 intel_batchbuffer_end_atomic(batch);
1213 intel_batchbuffer_flush(batch);
1217 gen9_init_gpe_context_avc(VADriverContextP ctx,
1218 struct i965_gpe_context *gpe_context,
1219 struct encoder_kernel_parameter *kernel_param)
1221 struct i965_driver_data *i965 = i965_driver_data(ctx);
1223 gpe_context->curbe.length = kernel_param->curbe_size; // in bytes
1225 gpe_context->sampler.entry_size = 0;
1226 gpe_context->sampler.max_entries = 0;
1228 if (kernel_param->sampler_size) {
1229 gpe_context->sampler.entry_size = ALIGN(kernel_param->sampler_size, 64);
1230 gpe_context->sampler.max_entries = 1;
1233 gpe_context->idrt.entry_size = ALIGN(sizeof(struct gen8_interface_descriptor_data), 64); // 8 dws, 1 register
1234 gpe_context->idrt.max_entries = NUM_KERNELS_PER_GPE_CONTEXT;
1236 gpe_context->surface_state_binding_table.max_entries = MAX_AVC_ENCODER_SURFACES;
1237 gpe_context->surface_state_binding_table.binding_table_offset = 0;
1238 gpe_context->surface_state_binding_table.surface_state_offset = ALIGN(MAX_AVC_ENCODER_SURFACES * 4, 64);
1239 gpe_context->surface_state_binding_table.length = ALIGN(MAX_AVC_ENCODER_SURFACES * 4, 64) + ALIGN(MAX_AVC_ENCODER_SURFACES * SURFACE_STATE_PADDED_SIZE_GEN9, 64);
1241 if (i965->intel.eu_total > 0)
1242 gpe_context->vfe_state.max_num_threads = 6 * i965->intel.eu_total;
1244 gpe_context->vfe_state.max_num_threads = 112; // 16 EU * 7 threads
1246 gpe_context->vfe_state.curbe_allocation_size = MAX(1, ALIGN(gpe_context->curbe.length, 32) >> 5); // in registers
1247 gpe_context->vfe_state.urb_entry_size = MAX(1, ALIGN(kernel_param->inline_data_size, 32) >> 5); // in registers
1248 gpe_context->vfe_state.num_urb_entries = (MAX_URB_SIZE -
1249 gpe_context->vfe_state.curbe_allocation_size -
1250 ((gpe_context->idrt.entry_size >> 5) *
1251 gpe_context->idrt.max_entries)) / gpe_context->vfe_state.urb_entry_size;
1252 gpe_context->vfe_state.num_urb_entries = CLAMP(1, 127, gpe_context->vfe_state.num_urb_entries);
1253 gpe_context->vfe_state.gpgpu_mode = 0;
1257 gen9_init_vfe_scoreboard_avc(struct i965_gpe_context *gpe_context,
1258 struct encoder_scoreboard_parameter *scoreboard_param)
1260 gpe_context->vfe_desc5.scoreboard0.mask = scoreboard_param->mask;
1261 gpe_context->vfe_desc5.scoreboard0.type = scoreboard_param->type;
1262 gpe_context->vfe_desc5.scoreboard0.enable = scoreboard_param->enable;
1264 if (scoreboard_param->walkpat_flag) {
1265 gpe_context->vfe_desc5.scoreboard0.mask = 0x0F;
1266 gpe_context->vfe_desc5.scoreboard0.type = 1;
1268 gpe_context->vfe_desc6.scoreboard1.delta_x0 = 0x0;
1269 gpe_context->vfe_desc6.scoreboard1.delta_y0 = 0xF;
1271 gpe_context->vfe_desc6.scoreboard1.delta_x1 = 0x0;
1272 gpe_context->vfe_desc6.scoreboard1.delta_y1 = 0xE;
1274 gpe_context->vfe_desc6.scoreboard1.delta_x2 = 0xF;
1275 gpe_context->vfe_desc6.scoreboard1.delta_y2 = 0x3;
1277 gpe_context->vfe_desc6.scoreboard1.delta_x3 = 0xF;
1278 gpe_context->vfe_desc6.scoreboard1.delta_y3 = 0x1;
1281 gpe_context->vfe_desc6.scoreboard1.delta_x0 = 0xF;
1282 gpe_context->vfe_desc6.scoreboard1.delta_y0 = 0x0;
1285 gpe_context->vfe_desc6.scoreboard1.delta_x1 = 0x0;
1286 gpe_context->vfe_desc6.scoreboard1.delta_y1 = 0xF;
1289 gpe_context->vfe_desc6.scoreboard1.delta_x2 = 0x1;
1290 gpe_context->vfe_desc6.scoreboard1.delta_y2 = 0xF;
1293 gpe_context->vfe_desc6.scoreboard1.delta_x3 = 0xF;
1294 gpe_context->vfe_desc6.scoreboard1.delta_y3 = 0xF;
1297 gpe_context->vfe_desc7.scoreboard2.delta_x4 = 0xF;
1298 gpe_context->vfe_desc7.scoreboard2.delta_y4 = 0x1;
1301 gpe_context->vfe_desc7.scoreboard2.delta_x5 = 0x0;
1302 gpe_context->vfe_desc7.scoreboard2.delta_y5 = 0xE;
1305 gpe_context->vfe_desc7.scoreboard2.delta_x6 = 0x1;
1306 gpe_context->vfe_desc7.scoreboard2.delta_y6 = 0xE;
1309 gpe_context->vfe_desc7.scoreboard2.delta_x6 = 0xF;
1310 gpe_context->vfe_desc7.scoreboard2.delta_y6 = 0xE;
1314 VME pipeline related function
1318 scaling kernel related function
1321 gen9_avc_set_curbe_scaling4x(VADriverContextP ctx,
1322 struct encode_state *encode_state,
1323 struct i965_gpe_context *gpe_context,
1324 struct intel_encoder_context *encoder_context,
1327 gen9_avc_scaling4x_curbe_data *curbe_cmd;
1328 struct scaling_param *surface_param = (struct scaling_param *)param;
1330 curbe_cmd = i965_gpe_context_map_curbe(gpe_context);
1335 memset(curbe_cmd, 0, sizeof(gen9_avc_scaling4x_curbe_data));
1337 curbe_cmd->dw0.input_picture_width = surface_param->input_frame_width;
1338 curbe_cmd->dw0.input_picture_height = surface_param->input_frame_height;
1340 curbe_cmd->dw1.input_y_bti = GEN9_AVC_SCALING_FRAME_SRC_Y_INDEX;
1341 curbe_cmd->dw2.output_y_bti = GEN9_AVC_SCALING_FRAME_DST_Y_INDEX;
1344 curbe_cmd->dw5.flatness_threshold = 128;
1345 curbe_cmd->dw6.enable_mb_flatness_check = surface_param->enable_mb_flatness_check;
1346 curbe_cmd->dw7.enable_mb_variance_output = surface_param->enable_mb_variance_output;
1347 curbe_cmd->dw8.enable_mb_pixel_average_output = surface_param->enable_mb_pixel_average_output;
1349 if (curbe_cmd->dw6.enable_mb_flatness_check ||
1350 curbe_cmd->dw7.enable_mb_variance_output ||
1351 curbe_cmd->dw8.enable_mb_pixel_average_output)
1353 curbe_cmd->dw10.mbv_proc_stat_bti = GEN9_AVC_SCALING_FRAME_MBVPROCSTATS_DST_INDEX;
1356 i965_gpe_context_unmap_curbe(gpe_context);
1361 gen9_avc_set_curbe_scaling2x(VADriverContextP ctx,
1362 struct encode_state *encode_state,
1363 struct i965_gpe_context *gpe_context,
1364 struct intel_encoder_context *encoder_context,
1367 gen9_avc_scaling2x_curbe_data *curbe_cmd;
1368 struct scaling_param *surface_param = (struct scaling_param *)param;
1370 curbe_cmd = i965_gpe_context_map_curbe(gpe_context);
1375 memset(curbe_cmd, 0, sizeof(gen9_avc_scaling2x_curbe_data));
1377 curbe_cmd->dw0.input_picture_width = surface_param->input_frame_width;
1378 curbe_cmd->dw0.input_picture_height = surface_param->input_frame_height;
1380 curbe_cmd->dw8.input_y_bti = GEN9_AVC_SCALING_FRAME_SRC_Y_INDEX;
1381 curbe_cmd->dw9.output_y_bti = GEN9_AVC_SCALING_FRAME_DST_Y_INDEX;
1383 i965_gpe_context_unmap_curbe(gpe_context);
1388 gen9_avc_send_surface_scaling(VADriverContextP ctx,
1389 struct encode_state *encode_state,
1390 struct i965_gpe_context *gpe_context,
1391 struct intel_encoder_context *encoder_context,
1394 struct scaling_param *surface_param = (struct scaling_param *)param;
1395 unsigned int surface_format;
1396 unsigned int res_size;
1398 if (surface_param->scaling_out_use_32unorm_surf_fmt)
1399 surface_format = I965_SURFACEFORMAT_R32_UNORM;
1400 else if (surface_param->scaling_out_use_16unorm_surf_fmt)
1401 surface_format = I965_SURFACEFORMAT_R16_UNORM;
1403 surface_format = I965_SURFACEFORMAT_R8_UNORM;
1405 gen9_add_2d_gpe_surface(ctx, gpe_context,
1406 surface_param->input_surface,
1407 0, 1, surface_format,
1408 GEN9_AVC_SCALING_FRAME_SRC_Y_INDEX);
1410 gen9_add_2d_gpe_surface(ctx, gpe_context,
1411 surface_param->output_surface,
1412 0, 1, surface_format,
1413 GEN9_AVC_SCALING_FRAME_DST_Y_INDEX);
1415 /*add buffer mv_proc_stat, here need change*/
1416 if (surface_param->mbv_proc_stat_enabled)
1418 res_size = 16 * (surface_param->input_frame_width/16) * (surface_param->input_frame_height/16) * sizeof(unsigned int);
1420 gen9_add_buffer_gpe_surface(ctx,
1422 surface_param->pres_mbv_proc_stat_buffer,
1426 GEN9_AVC_SCALING_FRAME_MBVPROCSTATS_DST_INDEX);
1427 }else if(surface_param->enable_mb_flatness_check)
1429 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
1430 surface_param->pres_flatness_check_surface,
1432 I965_SURFACEFORMAT_R8_UNORM,
1433 GEN9_AVC_SCALING_FRAME_MBVPROCSTATS_DST_INDEX);
1440 gen9_avc_kernel_scaling(VADriverContextP ctx,
1441 struct encode_state *encode_state,
1442 struct intel_encoder_context *encoder_context,
1445 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1446 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
1447 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
1448 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
1449 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
1451 struct i965_gpe_context *gpe_context;
1452 struct scaling_param surface_param;
1453 struct object_surface *obj_surface;
1454 struct gen9_surface_avc *avc_priv_surface;
1455 struct gpe_media_object_walker_parameter media_object_walker_param;
1456 struct gpe_encoder_kernel_walker_parameter kernel_walker_param;
1457 unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
1458 int media_function = 0;
1461 obj_surface = encode_state->reconstructed_object;
1462 avc_priv_surface = obj_surface->private_data;
1464 memset(&surface_param,0,sizeof(struct scaling_param));
1467 case INTEL_ENC_HME_4x :
1469 media_function = INTEL_MEDIA_STATE_4X_SCALING;
1470 kernel_idx = GEN9_AVC_KERNEL_SCALING_4X_IDX;
1471 downscaled_width_in_mb = generic_state->downscaled_width_4x_in_mb;
1472 downscaled_height_in_mb = generic_state->downscaled_height_4x_in_mb;
1474 surface_param.input_surface = encode_state->input_yuv_object ;
1475 surface_param.input_frame_width = generic_state->frame_width_in_pixel ;
1476 surface_param.input_frame_height = generic_state->frame_height_in_pixel ;
1478 surface_param.output_surface = avc_priv_surface->scaled_4x_surface_obj ;
1479 surface_param.output_frame_width = generic_state->frame_width_4x ;
1480 surface_param.output_frame_height = generic_state->frame_height_4x ;
1482 surface_param.enable_mb_flatness_check = avc_state->flatness_check_enable;
1483 surface_param.enable_mb_variance_output = avc_state->mb_status_enable;
1484 surface_param.enable_mb_pixel_average_output = avc_state->mb_status_enable;
1486 surface_param.blk8x8_stat_enabled = 0 ;
1487 surface_param.use_4x_scaling = 1 ;
1488 surface_param.use_16x_scaling = 0 ;
1489 surface_param.use_32x_scaling = 0 ;
1492 case INTEL_ENC_HME_16x :
1494 media_function = INTEL_MEDIA_STATE_16X_SCALING;
1495 kernel_idx = GEN9_AVC_KERNEL_SCALING_4X_IDX;
1496 downscaled_width_in_mb = generic_state->downscaled_width_16x_in_mb;
1497 downscaled_height_in_mb = generic_state->downscaled_height_16x_in_mb;
1499 surface_param.input_surface = avc_priv_surface->scaled_4x_surface_obj ;
1500 surface_param.input_frame_width = generic_state->frame_width_4x ;
1501 surface_param.input_frame_height = generic_state->frame_height_4x ;
1503 surface_param.output_surface = avc_priv_surface->scaled_16x_surface_obj ;
1504 surface_param.output_frame_width = generic_state->frame_width_16x ;
1505 surface_param.output_frame_height = generic_state->frame_height_16x ;
1507 surface_param.enable_mb_flatness_check = 0 ;
1508 surface_param.enable_mb_variance_output = 0 ;
1509 surface_param.enable_mb_pixel_average_output = 0 ;
1511 surface_param.blk8x8_stat_enabled = 0 ;
1512 surface_param.use_4x_scaling = 0 ;
1513 surface_param.use_16x_scaling = 1 ;
1514 surface_param.use_32x_scaling = 0 ;
1518 case INTEL_ENC_HME_32x :
1520 media_function = INTEL_MEDIA_STATE_32X_SCALING;
1521 kernel_idx = GEN9_AVC_KERNEL_SCALING_2X_IDX;
1522 downscaled_width_in_mb = generic_state->downscaled_width_32x_in_mb;
1523 downscaled_height_in_mb = generic_state->downscaled_height_32x_in_mb;
1525 surface_param.input_surface = avc_priv_surface->scaled_16x_surface_obj ;
1526 surface_param.input_frame_width = generic_state->frame_width_16x ;
1527 surface_param.input_frame_height = generic_state->frame_height_16x ;
1529 surface_param.output_surface = avc_priv_surface->scaled_32x_surface_obj ;
1530 surface_param.output_frame_width = generic_state->frame_width_32x ;
1531 surface_param.output_frame_height = generic_state->frame_height_32x ;
1533 surface_param.enable_mb_flatness_check = 0 ;
1534 surface_param.enable_mb_variance_output = 0 ;
1535 surface_param.enable_mb_pixel_average_output = 0 ;
1537 surface_param.blk8x8_stat_enabled = 0 ;
1538 surface_param.use_4x_scaling = 0 ;
1539 surface_param.use_16x_scaling = 0 ;
1540 surface_param.use_32x_scaling = 1 ;
1548 gpe_context = &(avc_ctx->context_scaling.gpe_contexts[kernel_idx]);
1550 gen8_gpe_context_init(ctx, gpe_context);
1551 gen9_gpe_reset_binding_table(ctx, gpe_context);
1553 if(surface_param.use_32x_scaling)
1555 generic_ctx->pfn_set_curbe_scaling2x(ctx,encode_state,gpe_context,encoder_context,&surface_param);
1558 generic_ctx->pfn_set_curbe_scaling4x(ctx,encode_state,gpe_context,encoder_context,&surface_param);
1561 if(surface_param.use_32x_scaling)
1563 surface_param.scaling_out_use_16unorm_surf_fmt = 1 ;
1564 surface_param.scaling_out_use_32unorm_surf_fmt = 0 ;
1567 surface_param.scaling_out_use_16unorm_surf_fmt = 0 ;
1568 surface_param.scaling_out_use_32unorm_surf_fmt = 1 ;
1571 if(surface_param.use_4x_scaling)
1573 if(avc_state->mb_status_supported)
1575 surface_param.enable_mb_flatness_check = 0;
1576 surface_param.mbv_proc_stat_enabled = (surface_param.use_4x_scaling)?(avc_state->mb_status_enable || avc_state->flatness_check_enable):0 ;
1577 surface_param.pres_mbv_proc_stat_buffer = &(avc_ctx->res_mb_status_buffer);
1581 surface_param.enable_mb_flatness_check = (surface_param.use_4x_scaling)?avc_state->flatness_check_enable:0;
1582 surface_param.mbv_proc_stat_enabled = 0 ;
1583 surface_param.pres_flatness_check_surface = &(avc_ctx->res_flatness_check_surface);
1587 generic_ctx->pfn_send_scaling_surface(ctx,encode_state,gpe_context,encoder_context,&surface_param);
1589 /* setup the interface data */
1590 gen8_gpe_setup_interface_data(ctx, gpe_context);
1592 memset(&kernel_walker_param, 0, sizeof(kernel_walker_param));
1593 if(surface_param.use_32x_scaling)
1595 kernel_walker_param.resolution_x = downscaled_width_in_mb ;
1596 kernel_walker_param.resolution_y = downscaled_height_in_mb ;
1599 /* the scaling is based on 8x8 blk level */
1600 kernel_walker_param.resolution_x = downscaled_width_in_mb * 2;
1601 kernel_walker_param.resolution_y = downscaled_height_in_mb * 2;
1603 kernel_walker_param.no_dependency = 1;
1605 i965_init_media_object_walker_parameter(&kernel_walker_param, &media_object_walker_param);
1607 gen9_avc_run_kernel_media_object_walker(ctx, encoder_context,
1610 &media_object_walker_param);
1612 return VA_STATUS_SUCCESS;
1616 frame/mb brc related function
1619 gen9_avc_init_mfx_avc_img_state(VADriverContextP ctx,
1620 struct encode_state *encode_state,
1621 struct intel_encoder_context *encoder_context,
1622 struct gen9_mfx_avc_img_state *pstate)
1624 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1625 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
1626 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
1628 VAEncSequenceParameterBufferH264 *seq_param = avc_state->seq_param;
1629 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
1631 memset(pstate, 0, sizeof(*pstate));
1633 pstate->dw0.dword_length = (sizeof(struct gen9_mfx_avc_img_state)) / 4 -2;
1634 pstate->dw0.sub_opcode_b = 0;
1635 pstate->dw0.sub_opcode_a = 0;
1636 pstate->dw0.command_opcode = 1;
1637 pstate->dw0.pipeline = 2;
1638 pstate->dw0.command_type = 3;
1640 pstate->dw1.frame_size_in_mbs = generic_state->frame_width_in_mbs * generic_state->frame_height_in_mbs ;
1642 pstate->dw2.frame_width_in_mbs_minus1 = generic_state->frame_width_in_mbs - 1;
1643 pstate->dw2.frame_height_in_mbs_minus1 = generic_state->frame_height_in_mbs - 1;
1645 pstate->dw3.image_structure = 0;//frame is zero
1646 pstate->dw3.weighted_bipred_idc = pic_param->pic_fields.bits.weighted_bipred_idc;
1647 pstate->dw3.weighted_pred_flag = pic_param->pic_fields.bits.weighted_pred_flag;
1648 pstate->dw3.brc_domain_rate_control_enable = 0;//0,set for non-vdenc mode;
1649 pstate->dw3.chroma_qp_offset = pic_param->chroma_qp_index_offset;
1650 pstate->dw3.second_chroma_qp_offset = pic_param->second_chroma_qp_index_offset;
1652 pstate->dw4.field_picture_flag = 0;
1653 pstate->dw4.mbaff_mode_active = seq_param->seq_fields.bits.mb_adaptive_frame_field_flag;
1654 pstate->dw4.frame_mb_only_flag = seq_param->seq_fields.bits.frame_mbs_only_flag;
1655 pstate->dw4.transform_8x8_idct_mode_flag = pic_param->pic_fields.bits.transform_8x8_mode_flag;
1656 pstate->dw4.direct_8x8_interface_flag = seq_param->seq_fields.bits.direct_8x8_inference_flag;
1657 pstate->dw4.constrained_intra_prediction_flag = pic_param->pic_fields.bits.constrained_intra_pred_flag;
1658 pstate->dw4.entropy_coding_flag = pic_param->pic_fields.bits.entropy_coding_mode_flag;
1659 pstate->dw4.mb_mv_format_flag = 1;
1660 pstate->dw4.chroma_format_idc = seq_param->seq_fields.bits.chroma_format_idc;
1661 pstate->dw4.mv_unpacked_flag = 1;
1662 pstate->dw4.insert_test_flag = 0;
1663 pstate->dw4.load_slice_pointer_flag = 0;
1664 pstate->dw4.macroblock_stat_enable = 0; /* disable in the first pass */
1665 pstate->dw4.minimum_frame_size = 0;
1666 pstate->dw5.intra_mb_max_bit_flag = 1;
1667 pstate->dw5.inter_mb_max_bit_flag = 1;
1668 pstate->dw5.frame_size_over_flag = 1;
1669 pstate->dw5.frame_size_under_flag = 1;
1670 pstate->dw5.intra_mb_ipcm_flag = 1;
1671 pstate->dw5.mb_rate_ctrl_flag = 0;
1672 pstate->dw5.non_first_pass_flag = 0;
1673 pstate->dw5.aq_enable = pstate->dw5.aq_rounding = 0;
1674 pstate->dw5.aq_chroma_disable = 1;
1675 if(pstate->dw4.entropy_coding_flag && (avc_state->tq_enable))
1677 pstate->dw5.aq_enable = avc_state->tq_enable;
1678 pstate->dw5.aq_rounding = avc_state->tq_rounding;
1681 pstate->dw5.aq_rounding = 0;
1684 pstate->dw6.intra_mb_max_size = 2700;
1685 pstate->dw6.inter_mb_max_size = 4095;
1687 pstate->dw8.slice_delta_qp_max0 = 0;
1688 pstate->dw8.slice_delta_qp_max1 = 0;
1689 pstate->dw8.slice_delta_qp_max2 = 0;
1690 pstate->dw8.slice_delta_qp_max3 = 0;
1692 pstate->dw9.slice_delta_qp_min0 = 0;
1693 pstate->dw9.slice_delta_qp_min1 = 0;
1694 pstate->dw9.slice_delta_qp_min2 = 0;
1695 pstate->dw9.slice_delta_qp_min3 = 0;
1697 pstate->dw10.frame_bitrate_min = 0;
1698 pstate->dw10.frame_bitrate_min_unit = 1;
1699 pstate->dw10.frame_bitrate_min_unit_mode = 1;
1700 pstate->dw10.frame_bitrate_max = (1 << 14) - 1;
1701 pstate->dw10.frame_bitrate_max_unit = 1;
1702 pstate->dw10.frame_bitrate_max_unit_mode = 1;
1704 pstate->dw11.frame_bitrate_min_delta = 0;
1705 pstate->dw11.frame_bitrate_max_delta = 0;
1707 pstate->dw12.vad_error_logic = 1;
1708 /* set paramters DW19/DW20 for slices */
1711 void gen9_avc_set_image_state(VADriverContextP ctx,
1712 struct encode_state *encode_state,
1713 struct intel_encoder_context *encoder_context,
1714 struct i965_gpe_resource *gpe_resource)
1716 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1717 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
1720 unsigned int * data;
1721 struct gen9_mfx_avc_img_state cmd;
1723 pdata = i965_map_gpe_resource(gpe_resource);
1728 gen9_avc_init_mfx_avc_img_state(ctx,encode_state,encoder_context,&cmd);
1729 for(i = 0; i < generic_state->num_pak_passes;i++)
1734 cmd.dw4.macroblock_stat_enable = 0;
1735 cmd.dw5.non_first_pass_flag = 0;
1738 cmd.dw4.macroblock_stat_enable = 1;
1739 cmd.dw5.non_first_pass_flag = 1;
1740 cmd.dw5.intra_mb_ipcm_flag = 1;
1743 cmd.dw5.mb_rate_ctrl_flag = 0;
1744 memcpy(pdata,&cmd,sizeof(struct gen9_mfx_avc_img_state));
1745 data = (unsigned int *)(pdata + sizeof(struct gen9_mfx_avc_img_state));
1746 *data = MI_BATCH_BUFFER_END;
1748 pdata += INTEL_AVC_IMAGE_STATE_CMD_SIZE;
1750 i965_unmap_gpe_resource(gpe_resource);
1754 void gen9_avc_set_image_state_non_brc(VADriverContextP ctx,
1755 struct encode_state *encode_state,
1756 struct intel_encoder_context *encoder_context,
1757 struct i965_gpe_resource *gpe_resource)
1759 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1760 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
1763 unsigned int * data;
1764 struct gen9_mfx_avc_img_state cmd;
1766 pdata = i965_map_gpe_resource(gpe_resource);
1771 gen9_avc_init_mfx_avc_img_state(ctx,encode_state,encoder_context,&cmd);
1773 if(generic_state->curr_pak_pass == 0)
1775 cmd.dw4.macroblock_stat_enable = 0;
1776 cmd.dw5.non_first_pass_flag = 0;
1781 cmd.dw4.macroblock_stat_enable = 1;
1782 cmd.dw5.non_first_pass_flag = 0;
1783 cmd.dw5.intra_mb_ipcm_flag = 1;
1786 cmd.dw5.mb_rate_ctrl_flag = 0;
1787 memcpy(pdata,&cmd,sizeof(struct gen9_mfx_avc_img_state));
1788 data = (unsigned int *)(pdata + sizeof(struct gen9_mfx_avc_img_state));
1789 *data = MI_BATCH_BUFFER_END;
1791 i965_unmap_gpe_resource(gpe_resource);
1796 gen9_avc_init_brc_const_data(VADriverContextP ctx,
1797 struct encode_state *encode_state,
1798 struct intel_encoder_context *encoder_context)
1800 struct i965_driver_data *i965 = i965_driver_data(ctx);
1801 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1802 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
1803 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
1804 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
1806 struct i965_gpe_resource *gpe_resource = NULL;
1807 unsigned char * data =NULL;
1808 unsigned char * data_tmp = NULL;
1809 unsigned int size = 0;
1810 unsigned int table_idx = 0;
1811 unsigned int block_based_skip_enable = avc_state->block_based_skip_enable;
1814 struct object_surface *obj_surface;
1815 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
1816 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
1817 VASurfaceID surface_id;
1818 unsigned int transform_8x8_mode_flag = pic_param->pic_fields.bits.transform_8x8_mode_flag;
1820 gpe_resource = &(avc_ctx->res_brc_const_data_buffer);
1821 assert(gpe_resource);
1823 i965_zero_gpe_resource(gpe_resource);
1825 data = i965_map_gpe_resource(gpe_resource);
1828 table_idx = slice_type_kernel[generic_state->frame_type];
1830 /* Fill surface with QP Adjustment table, Distortion threshold table, MaxFrame threshold table, Distortion QP Adjustment Table*/
1831 size = sizeof(gen9_avc_qp_adjustment_dist_threshold_max_frame_threshold_dist_qp_adjustment_ipb);
1832 memcpy(data,gen9_avc_qp_adjustment_dist_threshold_max_frame_threshold_dist_qp_adjustment_ipb,size*sizeof(unsigned char));
1836 /* skip threshold table*/
1838 switch(generic_state->frame_type)
1841 memcpy(data,gen9_avc_skip_value_p[block_based_skip_enable][transform_8x8_mode_flag],size * sizeof(unsigned char));
1844 memcpy(data,gen9_avc_skip_value_b[block_based_skip_enable][transform_8x8_mode_flag],size * sizeof(unsigned char));
1847 /*SLICE_TYPE_I,no change */
1851 if((generic_state->frame_type != SLICE_TYPE_I) && avc_state->non_ftq_skip_threshold_lut_input_enable)
1853 for(i = 0; i< 52 ; i++)
1855 *(data + 1 + (i * 2)) = (unsigned char)i965_avc_calc_skip_value(block_based_skip_enable,transform_8x8_mode_flag,avc_state->non_ftq_skip_threshold_lut[i]);
1860 /*fill the qp for ref list*/
1861 size = 32 + 32 +32 +160;
1862 memset(data,0xff,32);
1863 memset(data+32+32,0xff,32);
1864 switch(generic_state->frame_type)
1868 for(i = 0 ; i < slice_param->num_ref_idx_l0_active_minus1 + 1; i++)
1870 surface_id = slice_param->RefPicList0[i].picture_id;
1871 obj_surface = SURFACE(surface_id);
1874 *(data + i) = avc_state->list_ref_idx[0][i];//?
1880 data = data + 32 + 32;
1881 for(i = 0 ; i < slice_param->num_ref_idx_l1_active_minus1 + 1; i++)
1883 surface_id = slice_param->RefPicList1[i].picture_id;
1884 obj_surface = SURFACE(surface_id);
1887 *(data + i) = avc_state->list_ref_idx[1][i];//?
1890 data = data - 32 - 32;
1892 for(i = 0 ; i < slice_param->num_ref_idx_l0_active_minus1 + 1; i++)
1894 surface_id = slice_param->RefPicList0[i].picture_id;
1895 obj_surface = SURFACE(surface_id);
1898 *(data + i) = avc_state->list_ref_idx[0][i];//?
1903 /*SLICE_TYPE_I,no change */
1908 /*mv cost and mode cost*/
1910 memcpy(data,(unsigned char *)&gen9_avc_mode_mv_cost_table[table_idx][0][0],size * sizeof(unsigned char));
1912 if(avc_state->old_mode_cost_enable)
1914 for(i = 0; i < 52 ; i++)
1916 *(data_tmp +3) = (unsigned int)gen9_avc_old_intra_mode_cost[i];
1921 if(avc_state->ftq_skip_threshold_lut_input_enable)
1923 for(i = 0; i < 52 ; i++)
1925 *(data + (i * 32) + 24) =
1926 *(data + (i * 32) + 25) =
1927 *(data + (i * 32) + 27) =
1928 *(data + (i * 32) + 28) =
1929 *(data + (i * 32) + 29) =
1930 *(data + (i * 32) + 30) =
1931 *(data + (i * 32) + 31) = avc_state->ftq_skip_threshold_lut[i];
1939 memcpy(data,(unsigned char *)&gen9_avc_ref_cost[table_idx][0],size * sizeof(unsigned char));
1944 if(avc_state->adaptive_intra_scaling_enable)
1946 memcpy(data,(unsigned char *)&gen9_avc_adaptive_intra_scaling_factor,size * sizeof(unsigned char));
1949 memcpy(data,(unsigned char *)&gen9_avc_intra_scaling_factor,size * sizeof(unsigned char));
1951 i965_unmap_gpe_resource(gpe_resource);
1955 gen9_avc_init_brc_const_data_old(VADriverContextP ctx,
1956 struct encode_state *encode_state,
1957 struct intel_encoder_context *encoder_context)
1959 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1960 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
1961 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
1962 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
1964 struct i965_gpe_resource *gpe_resource = NULL;
1965 unsigned int * data =NULL;
1966 unsigned int * data_tmp = NULL;
1967 unsigned int size = 0;
1968 unsigned int table_idx = 0;
1969 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
1970 unsigned int block_based_skip_enable = avc_state->block_based_skip_enable;
1971 unsigned int transform_8x8_mode_flag = pic_param->pic_fields.bits.transform_8x8_mode_flag;
1974 gpe_resource = &(avc_ctx->res_brc_const_data_buffer);
1975 assert(gpe_resource);
1977 i965_zero_gpe_resource(gpe_resource);
1979 data = i965_map_gpe_resource(gpe_resource);
1982 table_idx = slice_type_kernel[generic_state->frame_type];
1984 /* Fill surface with QP Adjustment table, Distortion threshold table, MaxFrame threshold table, Distortion QP Adjustment Table*/
1985 size = sizeof(gen75_avc_qp_adjustment_dist_threshold_max_frame_threshold_dist_qp_adjustment_ipb);
1986 memcpy(data,gen75_avc_qp_adjustment_dist_threshold_max_frame_threshold_dist_qp_adjustment_ipb,size*sizeof(unsigned char));
1990 /* skip threshold table*/
1992 switch(generic_state->frame_type)
1995 memcpy(data,gen9_avc_skip_value_p[block_based_skip_enable][transform_8x8_mode_flag],size * sizeof(unsigned char));
1998 memcpy(data,gen9_avc_skip_value_b[block_based_skip_enable][transform_8x8_mode_flag],size * sizeof(unsigned char));
2001 /*SLICE_TYPE_I,no change */
2005 if((generic_state->frame_type != SLICE_TYPE_I) && avc_state->non_ftq_skip_threshold_lut_input_enable)
2007 for(i = 0; i< 52 ; i++)
2009 *(data + 1 + (i * 2)) = (unsigned char)i965_avc_calc_skip_value(block_based_skip_enable,transform_8x8_mode_flag,avc_state->non_ftq_skip_threshold_lut[i]);
2014 /*fill the qp for ref list*/
2020 /*mv cost and mode cost*/
2022 memcpy(data,(unsigned char *)&gen75_avc_mode_mv_cost_table[table_idx][0][0],size * sizeof(unsigned char));
2024 if(avc_state->old_mode_cost_enable)
2026 for(i = 0; i < 52 ; i++)
2028 *(data_tmp +3) = (unsigned int)gen9_avc_old_intra_mode_cost[i];
2033 if(avc_state->ftq_skip_threshold_lut_input_enable)
2035 for(i = 0; i < 52 ; i++)
2037 *(data + (i * 32) + 24) =
2038 *(data + (i * 32) + 25) =
2039 *(data + (i * 32) + 27) =
2040 *(data + (i * 32) + 28) =
2041 *(data + (i * 32) + 29) =
2042 *(data + (i * 32) + 30) =
2043 *(data + (i * 32) + 31) = avc_state->ftq_skip_threshold_lut[i];
2051 memcpy(data,(unsigned char *)&gen9_avc_ref_cost[table_idx][0],size * sizeof(unsigned char));
2053 i965_unmap_gpe_resource(gpe_resource);
2056 gen9_avc_set_curbe_brc_init_reset(VADriverContextP ctx,
2057 struct encode_state *encode_state,
2058 struct i965_gpe_context *gpe_context,
2059 struct intel_encoder_context *encoder_context,
2062 gen9_avc_brc_init_reset_curbe_data *cmd;
2063 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2064 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
2065 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
2066 double input_bits_per_frame = 0;
2067 double bps_ratio = 0;
2068 VAEncSequenceParameterBufferH264 * seq_param = avc_state->seq_param;
2069 struct avc_param common_param;
2071 cmd = i965_gpe_context_map_curbe(gpe_context);
2076 memcpy(cmd,&gen9_avc_brc_init_reset_curbe_init_data,sizeof(gen9_avc_brc_init_reset_curbe_data));
2078 memset(&common_param,0,sizeof(common_param));
2079 common_param.frame_width_in_pixel = generic_state->frame_width_in_pixel;
2080 common_param.frame_height_in_pixel = generic_state->frame_height_in_pixel;
2081 common_param.frame_width_in_mbs = generic_state->frame_width_in_mbs;
2082 common_param.frame_height_in_mbs = generic_state->frame_height_in_mbs;
2083 common_param.frames_per_100s = generic_state->frames_per_100s;
2084 common_param.vbv_buffer_size_in_bit = generic_state->vbv_buffer_size_in_bit;
2085 common_param.target_bit_rate = generic_state->target_bit_rate;
2087 cmd->dw0.profile_level_max_frame = i965_avc_get_profile_level_max_frame(&common_param,seq_param->level_idc);
2088 cmd->dw1.init_buf_full_in_bits = generic_state->init_vbv_buffer_fullness_in_bit;
2089 cmd->dw2.buf_size_in_bits = generic_state->vbv_buffer_size_in_bit;
2090 cmd->dw3.average_bit_rate = generic_state->target_bit_rate * 1000;
2091 cmd->dw4.max_bit_rate = generic_state->max_bit_rate * 1000;
2092 cmd->dw8.gop_p = (generic_state->gop_ref_distance)?((generic_state->gop_size -1)/generic_state->gop_ref_distance):0;
2093 cmd->dw9.gop_b = (generic_state->gop_size - 1 - cmd->dw8.gop_p);
2094 cmd->dw9.frame_width_in_bytes = generic_state->frame_width_in_pixel;
2095 cmd->dw10.frame_height_in_bytes = generic_state->frame_height_in_pixel;
2096 cmd->dw12.no_slices = avc_state->slice_num;
2099 if(seq_param->vui_parameters_present_flag && generic_state->internal_rate_mode != INTEL_BRC_AVBR )
2101 cmd->dw4.max_bit_rate = cmd->dw4.max_bit_rate;
2102 if(generic_state->internal_rate_mode == VA_RC_CBR)
2104 cmd->dw3.average_bit_rate = cmd->dw4.max_bit_rate;
2109 cmd->dw6.frame_rate_m = generic_state->frames_per_100s;
2110 cmd->dw7.frame_rate_d = 100;
2111 cmd->dw8.brc_flag = 0;
2112 cmd->dw8.brc_flag |= (generic_state->mb_brc_enabled)? 0 : 0x8000;
2115 if(generic_state->internal_rate_mode == VA_RC_CBR)
2117 cmd->dw4.max_bit_rate = cmd->dw3.average_bit_rate;
2118 cmd->dw8.brc_flag = cmd->dw8.brc_flag |INTEL_ENCODE_BRCINIT_ISCBR;
2120 }else if(generic_state->internal_rate_mode == VA_RC_VBR)
2122 if(cmd->dw4.max_bit_rate < cmd->dw3.average_bit_rate)
2124 cmd->dw4.max_bit_rate = cmd->dw3.average_bit_rate << 1;
2126 cmd->dw8.brc_flag = cmd->dw8.brc_flag |INTEL_ENCODE_BRCINIT_ISVBR;
2128 }else if(generic_state->internal_rate_mode == INTEL_BRC_AVBR)
2130 cmd->dw4.max_bit_rate =cmd->dw3.average_bit_rate;
2131 cmd->dw8.brc_flag = cmd->dw8.brc_flag |INTEL_ENCODE_BRCINIT_ISAVBR;
2134 //igonre icq/vcm/qvbr
2136 cmd->dw10.avbr_accuracy = generic_state->avbr_curracy;
2137 cmd->dw11.avbr_convergence = generic_state->avbr_convergence;
2140 input_bits_per_frame = (double)(cmd->dw4.max_bit_rate) * (double)(cmd->dw7.frame_rate_d)/(double)(cmd->dw6.frame_rate_m);;
2142 if(cmd->dw2.buf_size_in_bits == 0)
2144 cmd->dw2.buf_size_in_bits = (unsigned int)(input_bits_per_frame * 4);
2147 if(cmd->dw1.init_buf_full_in_bits == 0)
2149 cmd->dw1.init_buf_full_in_bits = cmd->dw2.buf_size_in_bits * 7/8;
2151 if(cmd->dw1.init_buf_full_in_bits < (unsigned int)(input_bits_per_frame * 2))
2153 cmd->dw1.init_buf_full_in_bits = (unsigned int)(input_bits_per_frame * 2);
2155 if(cmd->dw1.init_buf_full_in_bits > cmd->dw2.buf_size_in_bits)
2157 cmd->dw1.init_buf_full_in_bits = cmd->dw2.buf_size_in_bits;
2161 if(generic_state->internal_rate_mode == INTEL_BRC_AVBR)
2163 cmd->dw2.buf_size_in_bits = 2 * generic_state->target_bit_rate * 1000;
2164 cmd->dw1.init_buf_full_in_bits = (unsigned int)(3 * cmd->dw2.buf_size_in_bits/4);
2168 bps_ratio = input_bits_per_frame / (cmd->dw2.buf_size_in_bits/30.0);
2169 bps_ratio = (bps_ratio < 0.1)? 0.1:(bps_ratio > 3.5)?3.5:bps_ratio;
2172 cmd->dw16.deviation_threshold_0_pand_b = (unsigned int)(-50 * pow(0.90,bps_ratio));
2173 cmd->dw16.deviation_threshold_1_pand_b = (unsigned int)(-50 * pow(0.66,bps_ratio));
2174 cmd->dw16.deviation_threshold_2_pand_b = (unsigned int)(-50 * pow(0.46,bps_ratio));
2175 cmd->dw16.deviation_threshold_3_pand_b = (unsigned int)(-50 * pow(0.3, bps_ratio));
2176 cmd->dw17.deviation_threshold_4_pand_b = (unsigned int)(50 * pow(0.3, bps_ratio));
2177 cmd->dw17.deviation_threshold_5_pand_b = (unsigned int)(50 * pow(0.46, bps_ratio));
2178 cmd->dw17.deviation_threshold_6_pand_b = (unsigned int)(50 * pow(0.7, bps_ratio));
2179 cmd->dw17.deviation_threshold_7_pand_b = (unsigned int)(50 * pow(0.9, bps_ratio));
2180 cmd->dw18.deviation_threshold_0_vbr = (unsigned int)(-50 * pow(0.9, bps_ratio));
2181 cmd->dw18.deviation_threshold_1_vbr = (unsigned int)(-50 * pow(0.7, bps_ratio));
2182 cmd->dw18.deviation_threshold_2_vbr = (unsigned int)(-50 * pow(0.5, bps_ratio));
2183 cmd->dw18.deviation_threshold_3_vbr = (unsigned int)(-50 * pow(0.3, bps_ratio));
2184 cmd->dw19.deviation_threshold_4_vbr = (unsigned int)(100 * pow(0.4, bps_ratio));
2185 cmd->dw19.deviation_threshold_5_vbr = (unsigned int)(100 * pow(0.5, bps_ratio));
2186 cmd->dw19.deviation_threshold_6_vbr = (unsigned int)(100 * pow(0.75,bps_ratio));
2187 cmd->dw19.deviation_threshold_7_vbr = (unsigned int)(100 * pow(0.9, bps_ratio));
2188 cmd->dw20.deviation_threshold_0_i = (unsigned int)(-50 * pow(0.8, bps_ratio));
2189 cmd->dw20.deviation_threshold_1_i = (unsigned int)(-50 * pow(0.6, bps_ratio));
2190 cmd->dw20.deviation_threshold_2_i = (unsigned int)(-50 * pow(0.34,bps_ratio));
2191 cmd->dw20.deviation_threshold_3_i = (unsigned int)(-50 * pow(0.2, bps_ratio));
2192 cmd->dw21.deviation_threshold_4_i = (unsigned int)(50 * pow(0.2, bps_ratio));
2193 cmd->dw21.deviation_threshold_5_i = (unsigned int)(50 * pow(0.4, bps_ratio));
2194 cmd->dw21.deviation_threshold_6_i = (unsigned int)(50 * pow(0.66, bps_ratio));
2195 cmd->dw21.deviation_threshold_7_i = (unsigned int)(50 * pow(0.9, bps_ratio));
2197 cmd->dw22.sliding_window_size = generic_state->frames_per_window_size;
2199 i965_gpe_context_unmap_curbe(gpe_context);
2205 gen9_avc_send_surface_brc_init_reset(VADriverContextP ctx,
2206 struct encode_state *encode_state,
2207 struct i965_gpe_context *gpe_context,
2208 struct intel_encoder_context *encoder_context,
2211 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2212 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
2214 gen9_add_buffer_gpe_surface(ctx,
2216 &avc_ctx->res_brc_history_buffer,
2218 avc_ctx->res_brc_history_buffer.size,
2220 GEN9_AVC_BRC_INIT_RESET_HISTORY_INDEX);
2222 gen9_add_buffer_2d_gpe_surface(ctx,
2224 &avc_ctx->res_brc_dist_data_surface,
2226 I965_SURFACEFORMAT_R8_UNORM,
2227 GEN9_AVC_BRC_INIT_RESET_DISTORTION_INDEX);
2233 gen9_avc_kernel_brc_init_reset(VADriverContextP ctx,
2234 struct encode_state *encode_state,
2235 struct intel_encoder_context *encoder_context)
2237 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2238 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
2239 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
2240 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
2242 struct i965_gpe_context *gpe_context;
2243 struct gpe_media_object_parameter media_object_param;
2244 struct gpe_media_object_inline_data media_object_inline_data;
2245 int media_function = 0;
2246 int kernel_idx = GEN9_AVC_KERNEL_BRC_INIT;
2248 media_function = INTEL_MEDIA_STATE_BRC_INIT_RESET;
2250 if(generic_state->brc_inited)
2251 kernel_idx = GEN9_AVC_KERNEL_BRC_RESET;
2253 gpe_context = &(avc_ctx->context_brc.gpe_contexts[kernel_idx]);
2255 gen8_gpe_context_init(ctx, gpe_context);
2256 gen9_gpe_reset_binding_table(ctx, gpe_context);
2258 generic_ctx->pfn_set_curbe_brc_init_reset(ctx,encode_state,gpe_context,encoder_context,NULL);
2260 generic_ctx->pfn_send_brc_init_reset_surface(ctx,encode_state,gpe_context,encoder_context,NULL);
2262 gen8_gpe_setup_interface_data(ctx, gpe_context);
2264 memset(&media_object_param, 0, sizeof(media_object_param));
2265 memset(&media_object_inline_data, 0, sizeof(media_object_inline_data));
2266 media_object_param.pinline_data = &media_object_inline_data;
2267 media_object_param.inline_size = sizeof(media_object_inline_data);
2269 gen9_avc_run_kernel_media_object(ctx, encoder_context,
2272 &media_object_param);
2274 return VA_STATUS_SUCCESS;
2278 gen9_avc_set_curbe_brc_frame_update(VADriverContextP ctx,
2279 struct encode_state *encode_state,
2280 struct i965_gpe_context *gpe_context,
2281 struct intel_encoder_context *encoder_context,
2284 gen9_avc_frame_brc_update_curbe_data *cmd;
2285 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2286 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
2287 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
2288 struct object_surface *obj_surface;
2289 struct gen9_surface_avc *avc_priv_surface;
2290 struct avc_param common_param;
2291 VAEncSequenceParameterBufferH264 * seq_param = avc_state->seq_param;
2293 obj_surface = encode_state->reconstructed_object;
2295 if (!obj_surface || !obj_surface->private_data)
2297 avc_priv_surface = obj_surface->private_data;
2299 cmd = i965_gpe_context_map_curbe(gpe_context);
2304 memcpy(cmd,&gen9_avc_frame_brc_update_curbe_init_data,sizeof(gen9_avc_frame_brc_update_curbe_data));
2306 cmd->dw5.target_size_flag = 0 ;
2307 if(generic_state->brc_init_current_target_buf_full_in_bits > (double)generic_state->brc_init_reset_buf_size_in_bits)
2310 generic_state->brc_init_current_target_buf_full_in_bits -= (double)generic_state->brc_init_reset_buf_size_in_bits;
2311 cmd->dw5.target_size_flag = 1 ;
2314 if(generic_state->skip_frame_enbale)
2316 cmd->dw6.num_skip_frames = generic_state->num_skip_frames ;
2317 cmd->dw7.size_skip_frames = generic_state->size_skip_frames;
2319 generic_state->brc_init_current_target_buf_full_in_bits += generic_state->brc_init_reset_input_bits_per_frame * generic_state->num_skip_frames;
2322 cmd->dw0.target_size = (unsigned int)generic_state->brc_init_current_target_buf_full_in_bits ;
2323 cmd->dw1.frame_number = generic_state->seq_frame_number ;
2324 cmd->dw2.size_of_pic_headers = generic_state->herder_bytes_inserted << 3 ;
2325 cmd->dw5.cur_frame_type = generic_state->frame_type ;
2326 cmd->dw5.brc_flag = 0 ;
2327 cmd->dw5.brc_flag |= (avc_priv_surface->is_as_ref)?INTEL_ENCODE_BRCUPDATE_IS_REFERENCE:0 ;
2329 if(avc_state->multi_pre_enable)
2331 cmd->dw5.brc_flag |= INTEL_ENCODE_BRCUPDATE_IS_ACTUALQP ;
2332 cmd->dw14.qp_index_of_cur_pic = avc_priv_surface->frame_idx ; //do not know this. use -1
2335 cmd->dw5.max_num_paks = generic_state->num_pak_passes ;
2336 if(avc_state->min_max_qp_enable)
2338 switch(generic_state->frame_type)
2341 cmd->dw6.minimum_qp = avc_state->min_qp_i ;
2342 cmd->dw6.maximum_qp = avc_state->max_qp_i ;
2345 cmd->dw6.minimum_qp = avc_state->min_qp_p ;
2346 cmd->dw6.maximum_qp = avc_state->max_qp_p ;
2349 cmd->dw6.minimum_qp = avc_state->min_qp_b ;
2350 cmd->dw6.maximum_qp = avc_state->max_qp_b ;
2355 cmd->dw6.minimum_qp = 0 ;
2356 cmd->dw6.maximum_qp = 0 ;
2358 cmd->dw6.enable_force_skip = avc_state->enable_force_skip ;
2359 cmd->dw6.enable_sliding_window = 0 ;
2361 generic_state->brc_init_current_target_buf_full_in_bits += generic_state->brc_init_reset_input_bits_per_frame;
2363 if(generic_state->internal_rate_mode == INTEL_BRC_AVBR)
2365 cmd->dw3.start_gadj_frame0 = (unsigned int)((10 * generic_state->avbr_convergence) / (double)150);
2366 cmd->dw3.start_gadj_frame1 = (unsigned int)((50 * generic_state->avbr_convergence) / (double)150);
2367 cmd->dw4.start_gadj_frame2 = (unsigned int)((100 * generic_state->avbr_convergence) / (double)150);
2368 cmd->dw4.start_gadj_frame3 = (unsigned int)((150 * generic_state->avbr_convergence) / (double)150);
2369 cmd->dw11.g_rate_ratio_threshold_0 = (unsigned int)((100 - (generic_state->avbr_curracy / (double)30)*(100 - 40)));
2370 cmd->dw11.g_rate_ratio_threshold_1 = (unsigned int)((100 - (generic_state->avbr_curracy / (double)30)*(100 - 75)));
2371 cmd->dw12.g_rate_ratio_threshold_2 = (unsigned int)((100 - (generic_state->avbr_curracy / (double)30)*(100 - 97)));
2372 cmd->dw12.g_rate_ratio_threshold_3 = (unsigned int)((100 + (generic_state->avbr_curracy / (double)30)*(103 - 100)));
2373 cmd->dw12.g_rate_ratio_threshold_4 = (unsigned int)((100 + (generic_state->avbr_curracy / (double)30)*(125 - 100)));
2374 cmd->dw12.g_rate_ratio_threshold_5 = (unsigned int)((100 + (generic_state->avbr_curracy / (double)30)*(160 - 100)));
2377 cmd->dw15.enable_roi = generic_state->brc_roi_enable ;
2379 memset(&common_param,0,sizeof(common_param));
2380 common_param.frame_width_in_pixel = generic_state->frame_width_in_pixel;
2381 common_param.frame_height_in_pixel = generic_state->frame_height_in_pixel;
2382 common_param.frame_width_in_mbs = generic_state->frame_width_in_mbs;
2383 common_param.frame_height_in_mbs = generic_state->frame_height_in_mbs;
2384 common_param.frames_per_100s = generic_state->frames_per_100s;
2385 common_param.vbv_buffer_size_in_bit = generic_state->vbv_buffer_size_in_bit;
2386 common_param.target_bit_rate = generic_state->target_bit_rate;
2388 cmd->dw19.user_max_frame = i965_avc_get_profile_level_max_frame(&common_param,seq_param->level_idc);
2389 i965_gpe_context_unmap_curbe(gpe_context);
2395 gen9_avc_send_surface_brc_frame_update(VADriverContextP ctx,
2396 struct encode_state *encode_state,
2397 struct i965_gpe_context *gpe_context,
2398 struct intel_encoder_context *encoder_context,
2401 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2402 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
2403 struct brc_param * param = (struct brc_param *)param_brc ;
2404 struct i965_gpe_context * gpe_context_mbenc = param->gpe_context_mbenc;
2407 /* brc history buffer*/
2408 gen9_add_buffer_gpe_surface(ctx,
2410 &avc_ctx->res_brc_history_buffer,
2412 avc_ctx->res_brc_history_buffer.size,
2414 GEN9_AVC_FRAME_BRC_UPDATE_HISTORY_INDEX);
2416 /* previous pak buffer*/
2417 gen9_add_buffer_gpe_surface(ctx,
2419 &avc_ctx->res_brc_pre_pak_statistics_output_buffer,
2421 avc_ctx->res_brc_pre_pak_statistics_output_buffer.size,
2423 GEN9_AVC_FRAME_BRC_UPDATE_PAK_STATISTICS_OUTPUT_INDEX);
2425 /* image state command buffer read only*/
2426 gen9_add_buffer_gpe_surface(ctx,
2428 &avc_ctx->res_brc_image_state_read_buffer,
2430 avc_ctx->res_brc_image_state_read_buffer.size,
2432 GEN9_AVC_FRAME_BRC_UPDATE_IMAGE_STATE_READ_INDEX);
2434 /* image state command buffer write only*/
2435 gen9_add_buffer_gpe_surface(ctx,
2437 &avc_ctx->res_brc_image_state_write_buffer,
2439 avc_ctx->res_brc_image_state_write_buffer.size,
2441 GEN9_AVC_FRAME_BRC_UPDATE_IMAGE_STATE_WRITE_INDEX);
2443 /* Mbenc curbe input buffer */
2444 gen9_add_dri_buffer_gpe_surface(ctx,
2446 gpe_context_mbenc->dynamic_state.bo,
2448 ALIGN(gpe_context_mbenc->curbe.length, 64),
2449 gpe_context_mbenc->curbe.offset,
2450 GEN9_AVC_FRAME_BRC_UPDATE_MBENC_CURBE_READ_INDEX);
2451 /* Mbenc curbe output buffer */
2452 gen9_add_dri_buffer_gpe_surface(ctx,
2454 gpe_context_mbenc->dynamic_state.bo,
2456 ALIGN(gpe_context_mbenc->curbe.length, 64),
2457 gpe_context_mbenc->curbe.offset,
2458 GEN9_AVC_FRAME_BRC_UPDATE_MBENC_CURBE_WRITE_INDEX);
2460 /* AVC_ME Distortion 2D surface buffer,input/output. is it res_brc_dist_data_surface*/
2461 gen9_add_buffer_2d_gpe_surface(ctx,
2463 &avc_ctx->res_brc_dist_data_surface,
2465 I965_SURFACEFORMAT_R8_UNORM,
2466 GEN9_AVC_FRAME_BRC_UPDATE_DISTORTION_INDEX);
2468 /* BRC const data 2D surface buffer */
2469 gen9_add_buffer_2d_gpe_surface(ctx,
2471 &avc_ctx->res_brc_const_data_buffer,
2473 I965_SURFACEFORMAT_R8_UNORM,
2474 GEN9_AVC_FRAME_BRC_UPDATE_CONSTANT_DATA_INDEX);
2476 /* MB statistical data surface*/
2477 gen9_add_buffer_gpe_surface(ctx,
2479 &avc_ctx->res_mb_status_buffer,
2481 avc_ctx->res_mb_status_buffer.size,
2483 GEN9_AVC_FRAME_BRC_UPDATE_MB_STATUS_INDEX);
2489 gen9_avc_kernel_brc_frame_update(VADriverContextP ctx,
2490 struct encode_state *encode_state,
2491 struct intel_encoder_context *encoder_context)
2494 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2495 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
2496 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
2497 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
2498 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
2500 struct i965_gpe_context *gpe_context;
2501 struct gpe_media_object_parameter media_object_param;
2502 struct gpe_media_object_inline_data media_object_inline_data;
2503 int media_function = 0;
2505 unsigned int mb_const_data_buffer_in_use,mb_qp_buffer_in_use;
2506 unsigned int brc_enabled = 0;
2507 unsigned int roi_enable = (generic_state->num_roi > 0)?1:0;
2508 unsigned int dirty_roi_enable = ((generic_state->dirty_num_roi > 0) && (generic_state->frame_type == SLICE_TYPE_P) && (0));
2510 /* the following set the mbenc curbe*/
2511 struct mbenc_param curbe_mbenc_param ;
2512 struct brc_param curbe_brc_param ;
2514 mb_const_data_buffer_in_use =
2515 generic_state->mb_brc_enabled ||
2518 avc_state->mb_qp_data_enable ||
2519 avc_state->rolling_intra_refresh_enable;
2520 mb_qp_buffer_in_use =
2521 generic_state->mb_brc_enabled ||
2522 generic_state->brc_roi_enable ||
2523 avc_state->mb_qp_data_enable;
2525 switch(generic_state->kernel_mode)
2527 case INTEL_ENC_KERNEL_NORMAL :
2529 kernel_idx = MBENC_KERNEL_BASE + GEN9_AVC_KERNEL_MBENC_NORMAL_I;
2532 case INTEL_ENC_KERNEL_PERFORMANCE :
2534 kernel_idx = MBENC_KERNEL_BASE + GEN9_AVC_KERNEL_MBENC_PERFORMANCE_I;
2537 case INTEL_ENC_KERNEL_QUALITY :
2539 kernel_idx = MBENC_KERNEL_BASE + GEN9_AVC_KERNEL_MBENC_QUALITY_I;
2547 if(generic_state->frame_type == SLICE_TYPE_P)
2551 else if(generic_state->frame_type == SLICE_TYPE_B)
2556 gpe_context = &(avc_ctx->context_mbenc.gpe_contexts[kernel_idx]);
2557 gen8_gpe_context_init(ctx, gpe_context);
2559 memset(&curbe_mbenc_param,0,sizeof(struct mbenc_param));
2561 curbe_mbenc_param.mb_const_data_buffer_in_use = mb_const_data_buffer_in_use;
2562 curbe_mbenc_param.mb_qp_buffer_in_use = mb_qp_buffer_in_use;
2563 curbe_mbenc_param.mbenc_i_frame_dist_in_use = 0;
2564 curbe_mbenc_param.brc_enabled = brc_enabled;
2565 curbe_mbenc_param.roi_enabled = roi_enable;
2567 /* set curbe mbenc*/
2568 generic_ctx->pfn_set_curbe_mbenc(ctx,encode_state,gpe_context,encoder_context,&curbe_mbenc_param);
2569 avc_state->mbenc_curbe_set_in_brc_update = 1;
2571 /*begin brc frame update*/
2572 memset(&curbe_brc_param,0,sizeof(struct brc_param));
2573 curbe_brc_param.gpe_context_mbenc = gpe_context;
2574 media_function = INTEL_MEDIA_STATE_BRC_UPDATE;
2575 kernel_idx = GEN9_AVC_KERNEL_BRC_FRAME_UPDATE;
2576 gpe_context = &(avc_ctx->context_brc.gpe_contexts[kernel_idx]);
2577 curbe_brc_param.gpe_context_brc_frame_update = gpe_context;
2579 gen8_gpe_context_init(ctx, gpe_context);
2580 gen9_gpe_reset_binding_table(ctx, gpe_context);
2581 /*brc copy ignored*/
2583 /* set curbe frame update*/
2584 generic_ctx->pfn_set_curbe_brc_frame_update(ctx,encode_state,gpe_context,encoder_context,&curbe_brc_param);
2586 /* load brc constant data, is it same as mbenc mb brc constant data? no.*/
2587 if(avc_state->multi_pre_enable)
2589 gen9_avc_init_brc_const_data(ctx,encode_state,encoder_context);
2592 gen9_avc_init_brc_const_data_old(ctx,encode_state,encoder_context);
2594 /* image state construct*/
2595 gen9_avc_set_image_state(ctx,encode_state,encoder_context,&(avc_ctx->res_brc_image_state_read_buffer));
2596 /* set surface frame mbenc*/
2597 generic_ctx->pfn_send_brc_frame_update_surface(ctx,encode_state,gpe_context,encoder_context,&curbe_brc_param);
2600 gen8_gpe_setup_interface_data(ctx, gpe_context);
2602 memset(&media_object_param, 0, sizeof(media_object_param));
2603 memset(&media_object_inline_data, 0, sizeof(media_object_inline_data));
2604 media_object_param.pinline_data = &media_object_inline_data;
2605 media_object_param.inline_size = sizeof(media_object_inline_data);
2607 gen9_avc_run_kernel_media_object(ctx, encoder_context,
2610 &media_object_param);
2612 return VA_STATUS_SUCCESS;
2616 gen9_avc_set_curbe_brc_mb_update(VADriverContextP ctx,
2617 struct encode_state *encode_state,
2618 struct i965_gpe_context *gpe_context,
2619 struct intel_encoder_context *encoder_context,
2622 gen9_avc_mb_brc_curbe_data *cmd;
2623 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2624 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
2626 cmd = i965_gpe_context_map_curbe(gpe_context);
2631 memset(cmd,0,sizeof(gen9_avc_mb_brc_curbe_data));
2633 cmd->dw0.cur_frame_type = generic_state->frame_type;
2634 if(generic_state->brc_roi_enable)
2636 cmd->dw0.enable_roi = 1;
2639 cmd->dw0.enable_roi = 0;
2642 i965_gpe_context_unmap_curbe(gpe_context);
2648 gen9_avc_send_surface_brc_mb_update(VADriverContextP ctx,
2649 struct encode_state *encode_state,
2650 struct i965_gpe_context *gpe_context,
2651 struct intel_encoder_context *encoder_context,
2654 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2655 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
2656 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
2658 /* brc history buffer*/
2659 gen9_add_buffer_gpe_surface(ctx,
2661 &avc_ctx->res_brc_history_buffer,
2663 avc_ctx->res_brc_history_buffer.size,
2665 GEN9_AVC_MB_BRC_UPDATE_HISTORY_INDEX);
2667 /* MB qp data buffer is it same as res_mbbrc_mb_qp_data_surface*/
2668 if(generic_state->mb_brc_enabled)
2670 gen9_add_buffer_2d_gpe_surface(ctx,
2672 &avc_ctx->res_mbbrc_mb_qp_data_surface,
2674 I965_SURFACEFORMAT_R8_UNORM,
2675 GEN9_AVC_MB_BRC_UPDATE_MB_QP_INDEX);
2679 /* BRC roi feature*/
2680 if(generic_state->brc_roi_enable)
2682 gen9_add_buffer_gpe_surface(ctx,
2684 &avc_ctx->res_mbbrc_roi_surface,
2686 avc_ctx->res_mbbrc_roi_surface.size,
2688 GEN9_AVC_MB_BRC_UPDATE_ROI_INDEX);
2692 /* MB statistical data surface*/
2693 gen9_add_buffer_gpe_surface(ctx,
2695 &avc_ctx->res_mb_status_buffer,
2697 avc_ctx->res_mb_status_buffer.size,
2699 GEN9_AVC_MB_BRC_UPDATE_MB_STATUS_INDEX);
2705 gen9_avc_kernel_brc_mb_update(VADriverContextP ctx,
2706 struct encode_state *encode_state,
2707 struct intel_encoder_context *encoder_context)
2710 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2711 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
2712 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
2713 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
2715 struct i965_gpe_context *gpe_context;
2716 struct gpe_media_object_walker_parameter media_object_walker_param;
2717 struct gpe_encoder_kernel_walker_parameter kernel_walker_param;
2718 int media_function = 0;
2721 media_function = INTEL_MEDIA_STATE_MB_BRC_UPDATE;
2722 kernel_idx = GEN9_AVC_KERNEL_BRC_MB_UPDATE;
2723 gpe_context = &(avc_ctx->context_brc.gpe_contexts[kernel_idx]);
2725 gen8_gpe_context_init(ctx, gpe_context);
2726 gen9_gpe_reset_binding_table(ctx, gpe_context);
2728 /* set curbe brc mb update*/
2729 generic_ctx->pfn_set_curbe_brc_mb_update(ctx,encode_state,gpe_context,encoder_context,NULL);
2732 /* set surface brc mb update*/
2733 generic_ctx->pfn_send_brc_mb_update_surface(ctx,encode_state,gpe_context,encoder_context,NULL);
2736 gen8_gpe_setup_interface_data(ctx, gpe_context);
2738 memset(&kernel_walker_param, 0, sizeof(kernel_walker_param));
2739 /* the scaling is based on 8x8 blk level */
2740 kernel_walker_param.resolution_x = (generic_state->frame_width_in_mbs + 1)/2;
2741 kernel_walker_param.resolution_y = (generic_state->frame_height_in_mbs + 1)/2 ;
2742 kernel_walker_param.no_dependency = 1;
2744 i965_init_media_object_walker_parameter(&kernel_walker_param, &media_object_walker_param);
2746 gen9_avc_run_kernel_media_object_walker(ctx, encoder_context,
2749 &media_object_walker_param);
2751 return VA_STATUS_SUCCESS;
2755 mbenc kernel related function,it include intra dist kernel
2758 gen9_avc_get_biweight(int dist_scale_factor_ref_id0_list0, unsigned short weighted_bipredidc)
2760 int biweight = 32; // default value
2762 /* based on kernel HLD*/
2763 if (weighted_bipredidc != INTEL_AVC_WP_MODE_IMPLICIT)
2769 biweight = (dist_scale_factor_ref_id0_list0 + 2) >> 2;
2771 if (biweight != 16 && biweight != 21 &&
2772 biweight != 32 && biweight != 43 && biweight != 48)
2774 biweight = 32; // If # of B-pics between two refs is more than 3. VME does not support it.
2782 gen9_avc_get_dist_scale_factor(VADriverContextP ctx,
2783 struct encode_state *encode_state,
2784 struct intel_encoder_context *encoder_context)
2786 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2787 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
2788 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
2789 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
2791 int max_num_references;
2792 VAPictureH264 *curr_pic;
2793 VAPictureH264 *ref_pic_l0;
2794 VAPictureH264 *ref_pic_l1;
2803 max_num_references = pic_param->num_ref_idx_l0_active_minus1 + 1;
2805 memset(avc_state->dist_scale_factor_list0,0,32*sizeof(unsigned int));
2806 curr_pic = &pic_param->CurrPic;
2807 for(i = 0; i < max_num_references; i++)
2809 ref_pic_l0 = &(slice_param->RefPicList0[i]);
2811 if((ref_pic_l0->flags & VA_PICTURE_H264_INVALID) ||
2812 (ref_pic_l0->picture_id == VA_INVALID_SURFACE) )
2814 ref_pic_l1 = &(slice_param->RefPicList1[0]);
2815 if((ref_pic_l0->flags & VA_PICTURE_H264_INVALID) ||
2816 (ref_pic_l0->picture_id == VA_INVALID_SURFACE) )
2819 poc0 = (curr_pic->TopFieldOrderCnt - ref_pic_l0->TopFieldOrderCnt);
2820 poc1 = (ref_pic_l1->TopFieldOrderCnt - ref_pic_l0->TopFieldOrderCnt);
2821 CLIP(poc0,-128,127);
2822 CLIP(poc1,-128,127);
2830 tmp = (td/2 > 0)?(td/2):(-(td/2));
2831 tx = (16384 + tmp)/td ;
2832 tmp = (tb*tx+32)>>6;
2833 CLIP(tmp,-1024,1023);
2834 avc_state->dist_scale_factor_list0[i] = tmp;
2840 gen9_avc_get_qp_from_ref_list(VADriverContextP ctx,
2841 VAEncSliceParameterBufferH264 *slice_param,
2845 struct i965_driver_data *i965 = i965_driver_data(ctx);
2846 struct object_surface *obj_surface;
2847 struct gen9_surface_avc *avc_priv_surface;
2848 VASurfaceID surface_id;
2850 assert(slice_param);
2855 if(ref_frame_idx < slice_param->num_ref_idx_l0_active_minus1 + 1)
2856 surface_id = slice_param->RefPicList0[ref_frame_idx].picture_id;
2861 if(ref_frame_idx < slice_param->num_ref_idx_l1_active_minus1 + 1)
2862 surface_id = slice_param->RefPicList1[ref_frame_idx].picture_id;
2866 obj_surface = SURFACE(surface_id);
2867 if(obj_surface && obj_surface->private_data)
2869 avc_priv_surface = obj_surface->private_data;
2870 return avc_priv_surface->qp_value;
2878 gen9_avc_load_mb_brc_const_data(VADriverContextP ctx,
2879 struct encode_state *encode_state,
2880 struct intel_encoder_context *encoder_context)
2882 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2883 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
2884 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
2885 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
2886 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
2888 struct i965_gpe_resource *gpe_resource = NULL;
2889 unsigned int * data =NULL;
2890 unsigned int * data_tmp = NULL;
2891 unsigned int size = 16 * 52;
2892 unsigned int table_idx = 0;
2893 unsigned int block_based_skip_enable = avc_state->block_based_skip_enable;
2894 unsigned int transform_8x8_mode_flag = pic_param->pic_fields.bits.transform_8x8_mode_flag;
2897 gpe_resource = &(avc_ctx->res_mbbrc_const_data_buffer);
2898 assert(gpe_resource);
2899 data = i965_map_gpe_resource(gpe_resource);
2902 table_idx = slice_type_kernel[generic_state->frame_type];
2904 memcpy(data,gen9_avc_mb_brc_const_data[table_idx][0],size*sizeof(unsigned int));
2908 switch(generic_state->frame_type)
2911 for(i = 0; i < 52 ; i++)
2913 if(avc_state->old_mode_cost_enable)
2914 *data = (unsigned int)gen9_avc_old_intra_mode_cost[i];
2920 for(i = 0; i < 52 ; i++)
2922 if(generic_state->frame_type == SLICE_TYPE_P)
2924 if(avc_state->skip_bias_adjustment_enable)
2925 *(data + 3) = (unsigned int)gen9_avc_mv_cost_p_skip_adjustment[i];
2927 if(avc_state->non_ftq_skip_threshold_lut_input_enable)
2929 *(data + 9) = (unsigned int)i965_avc_calc_skip_value(block_based_skip_enable,transform_8x8_mode_flag,avc_state->non_ftq_skip_threshold_lut[i]);
2930 }else if(generic_state->frame_type == SLICE_TYPE_P)
2932 *(data + 9) = (unsigned int)gen9_avc_skip_value_p[block_based_skip_enable][transform_8x8_mode_flag][i];
2935 *(data + 9) = (unsigned int)gen9_avc_skip_value_b[block_based_skip_enable][transform_8x8_mode_flag][i];
2938 if(avc_state->adaptive_intra_scaling_enable)
2940 *(data + 10) = (unsigned int)gen9_avc_adaptive_intra_scaling_factor[i];
2943 *(data + 10) = (unsigned int)gen9_avc_intra_scaling_factor[i];
2955 for(i = 0; i < 52 ; i++)
2957 if(avc_state->ftq_skip_threshold_lut_input_enable)
2959 *(data + 6) = (avc_state->ftq_skip_threshold_lut[i] |
2960 (avc_state->ftq_skip_threshold_lut[i] <<16) |
2961 (avc_state->ftq_skip_threshold_lut[i] <<24) );
2962 *(data + 7) = (avc_state->ftq_skip_threshold_lut[i] |
2963 (avc_state->ftq_skip_threshold_lut[i] <<8) |
2964 (avc_state->ftq_skip_threshold_lut[i] <<16) |
2965 (avc_state->ftq_skip_threshold_lut[i] <<24) );
2968 if(avc_state->kernel_trellis_enable)
2970 *(data + 11) = (unsigned int)avc_state->lamda_value_lut[i][0];
2971 *(data + 12) = (unsigned int)avc_state->lamda_value_lut[i][1];
2977 i965_unmap_gpe_resource(gpe_resource);
2981 gen9_avc_set_curbe_mbenc(VADriverContextP ctx,
2982 struct encode_state *encode_state,
2983 struct i965_gpe_context *gpe_context,
2984 struct intel_encoder_context *encoder_context,
2987 struct i965_driver_data *i965 = i965_driver_data(ctx);
2988 gen9_avc_mbenc_curbe_data *cmd;
2989 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2990 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
2991 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
2993 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
2994 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
2995 VASurfaceID surface_id;
2996 struct object_surface *obj_surface;
2998 struct mbenc_param * curbe_param = (struct mbenc_param *)param ;
2999 unsigned char qp = 0;
3000 unsigned char me_method = 0;
3001 unsigned int mbenc_i_frame_dist_in_use = curbe_param->mbenc_i_frame_dist_in_use;
3002 unsigned int table_idx = 0;
3004 unsigned int preset = generic_state->preset;
3005 me_method = (generic_state->frame_type == SLICE_TYPE_B)? gen9_avc_b_me_method[preset]:gen9_avc_p_me_method[preset];
3006 qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
3008 cmd = (gen9_avc_mbenc_curbe_data *)i965_gpe_context_map_curbe(gpe_context);
3013 memset(cmd,0,sizeof(gen9_avc_mbenc_curbe_data));
3015 if(mbenc_i_frame_dist_in_use)
3017 memcpy(cmd,gen9_avc_mbenc_curbe_i_frame_dist_init_data,sizeof(gen9_avc_mbenc_curbe_data));
3021 switch(generic_state->frame_type)
3024 memcpy(cmd,gen9_avc_mbenc_curbe_normal_i_frame_init_data,sizeof(gen9_avc_mbenc_curbe_data));
3027 memcpy(cmd,gen9_avc_mbenc_curbe_normal_p_frame_init_data,sizeof(gen9_avc_mbenc_curbe_data));
3030 memcpy(cmd,gen9_avc_mbenc_curbe_normal_b_frame_init_data,sizeof(gen9_avc_mbenc_curbe_data));
3037 cmd->dw0.adaptive_enable = gen9_avc_enable_adaptive_search[preset];
3038 cmd->dw37.adaptive_enable = gen9_avc_enable_adaptive_search[preset];
3039 cmd->dw0.t8x8_flag_for_inter_enable = pic_param->pic_fields.bits.transform_8x8_mode_flag;
3040 cmd->dw37.t8x8_flag_for_inter_enable = pic_param->pic_fields.bits.transform_8x8_mode_flag;
3042 cmd->dw2.max_len_sp = gen9_avc_max_len_sp[preset];
3043 cmd->dw38.max_len_sp = 0;
3045 cmd->dw3.src_access = 0;
3046 cmd->dw3.ref_access = 0;
3048 if(avc_state->ftq_enable && (generic_state->frame_type != SLICE_TYPE_I))
3050 if(avc_state->ftq_override)
3052 cmd->dw3.ftq_enable = avc_state->ftq_enable;
3056 if(generic_state->frame_type == SLICE_TYPE_P)
3058 cmd->dw3.ftq_enable = gen9_avc_max_ftq_based_skip[preset] & 0x01;
3062 cmd->dw3.ftq_enable = (gen9_avc_max_ftq_based_skip[preset] >> 1) & 0x01;
3067 cmd->dw3.ftq_enable = 0;
3070 if(avc_state->disable_sub_mb_partion)
3071 cmd->dw3.sub_mb_part_mask = 0x7;
3073 if(mbenc_i_frame_dist_in_use)
3075 cmd->dw2.pitch_width = generic_state->downscaled_width_4x_in_mb;
3076 cmd->dw4.picture_height_minus1 = generic_state->downscaled_height_4x_in_mb - 1;
3077 cmd->dw5.slice_mb_height = (avc_state->slice_height + 4 - 1)/4;
3078 cmd->dw6.batch_buffer_end = 0;
3079 cmd->dw31.intra_compute_type = 1;
3083 cmd->dw2.pitch_width = generic_state->frame_width_in_mbs;
3084 cmd->dw4.picture_height_minus1 = generic_state->frame_height_in_mbs - 1;
3085 cmd->dw5.slice_mb_height = (avc_state->arbitrary_num_mbs_in_slice)?generic_state->frame_height_in_mbs:avc_state->slice_height;
3088 memcpy(&(cmd->dw8),gen9_avc_mode_mv_cost_table[slice_type_kernel[generic_state->frame_type]][qp],8*sizeof(unsigned int));
3089 if((generic_state->frame_type == SLICE_TYPE_I) && avc_state->old_mode_cost_enable)
3091 //cmd->dw8 = gen9_avc_old_intra_mode_cost[qp];
3092 }else if(avc_state->skip_bias_adjustment_enable)
3094 /* Load different MvCost for P picture when SkipBiasAdjustment is enabled
3095 // No need to check for P picture as the flag is only enabled for P picture */
3096 cmd->dw11.value = gen9_avc_mv_cost_p_skip_adjustment[qp];
3101 table_idx = (generic_state->frame_type == SLICE_TYPE_B)?1:0;
3102 memcpy(&(cmd->dw16),table_enc_search_path[table_idx][me_method],16*sizeof(unsigned int));
3104 cmd->dw4.enable_fbr_bypass = avc_state->fbr_bypass_enable;
3105 cmd->dw4.enable_intra_cost_scaling_for_static_frame = avc_state->sfd_enable && generic_state->hme_enabled;
3106 cmd->dw4.field_parity_flag = 0;//bottom field
3107 cmd->dw4.enable_cur_fld_idr = 0;//field realted
3108 cmd->dw4.contrained_intra_pred_flag = pic_param->pic_fields.bits.constrained_intra_pred_flag;
3109 cmd->dw4.hme_enable = generic_state->hme_enabled;
3110 cmd->dw4.picture_type = slice_type_kernel[generic_state->frame_type];
3111 cmd->dw4.use_actual_ref_qp_value = generic_state->hme_enabled && (gen9_avc_mr_disable_qp_check[preset] == 0);
3114 cmd->dw7.intra_part_mask = pic_param->pic_fields.bits.transform_8x8_mode_flag?0:0x02;
3115 cmd->dw7.src_field_polarity = 0;//field related
3117 /*ftq_skip_threshold_lut set,dw14 /15*/
3119 /*r5 disable NonFTQSkipThresholdLUT*/
3120 if(generic_state->frame_type == SLICE_TYPE_P)
3122 cmd->dw32.skip_val = gen9_avc_skip_value_p[avc_state->block_based_skip_enable][pic_param->pic_fields.bits.transform_8x8_mode_flag][qp];
3124 }else if(generic_state->frame_type == SLICE_TYPE_B)
3126 cmd->dw32.skip_val = gen9_avc_skip_value_b[avc_state->block_based_skip_enable][pic_param->pic_fields.bits.transform_8x8_mode_flag][qp];
3130 cmd->dw13.qp_prime_y = qp;
3131 cmd->dw13.qp_prime_cb = qp;
3132 cmd->dw13.qp_prime_cr = qp;
3133 cmd->dw13.target_size_in_word = 0xff;//hardcode for brc disable
3136 if((generic_state->frame_type != SLICE_TYPE_I)&& avc_state->multi_pre_enable)
3138 switch(gen9_avc_multi_pred[preset])
3141 cmd->dw32.mult_pred_l0_disable = 128;
3142 cmd->dw32.mult_pred_l1_disable = 128;
3145 cmd->dw32.mult_pred_l0_disable = (generic_state->frame_type == SLICE_TYPE_P)?1:128;
3146 cmd->dw32.mult_pred_l1_disable = 128;
3149 cmd->dw32.mult_pred_l0_disable = (generic_state->frame_type == SLICE_TYPE_B)?1:128;
3150 cmd->dw32.mult_pred_l1_disable = (generic_state->frame_type == SLICE_TYPE_B)?1:128;
3153 cmd->dw32.mult_pred_l0_disable = 1;
3154 cmd->dw32.mult_pred_l1_disable = (generic_state->frame_type == SLICE_TYPE_B)?1:128;
3161 cmd->dw32.mult_pred_l0_disable = 128;
3162 cmd->dw32.mult_pred_l1_disable = 128;
3165 /*field setting for dw33 34, ignored*/
3167 if(avc_state->adaptive_transform_decision_enable)
3169 if(generic_state->frame_type != SLICE_TYPE_I)
3171 cmd->dw34.enable_adaptive_tx_decision = 1;
3174 cmd->dw58.mb_texture_threshold = 1024;
3175 cmd->dw58.tx_decision_threshold = 128;
3179 if(generic_state->frame_type == SLICE_TYPE_B)
3181 cmd->dw34.list1_ref_id0_frm_field_parity = 0; //frame only
3182 cmd->dw34.list1_ref_id0_frm_field_parity = 0;
3183 cmd->dw34.b_direct_mode = slice_param->direct_spatial_mv_pred_flag;
3185 cmd->dw34.b_original_bff = 0; //frame only
3186 cmd->dw34.enable_mb_flatness_check_optimization = avc_state->flatness_check_enable;
3187 cmd->dw34.roi_enable_flag = curbe_param->roi_enabled;
3188 cmd->dw34.mad_enable_falg = avc_state->mad_enable;
3189 cmd->dw34.mb_brc_enable = avc_state->mb_qp_data_enable || generic_state->mb_brc_enabled;
3190 cmd->dw34.arbitray_num_mbs_per_slice = avc_state->arbitrary_num_mbs_in_slice;
3191 cmd->dw34.force_non_skip_check = avc_state->mb_disable_skip_map_enable;
3193 if(cmd->dw34.force_non_skip_check)
3195 cmd->dw34.disable_enc_skip_check = avc_state->skip_check_disable;
3198 cmd->dw36.check_all_fractional_enable = avc_state->caf_enable;
3199 cmd->dw38.ref_threshold = 400;
3200 cmd->dw39.hme_ref_windows_comb_threshold = (generic_state->frame_type == SLICE_TYPE_B)?gen9_avc_hme_b_combine_len[preset]:gen9_avc_hme_combine_len[preset];
3202 /* Default:2 used for MBBRC (MB QP Surface width and height are 4x downscaled picture in MB unit * 4 bytes)
3203 0 used for MBQP data surface (MB QP Surface width and height are same as the input picture size in MB unit * 1bytes)
3204 starting GEN9, BRC use split kernel, MB QP surface is same size as input picture */
3205 cmd->dw47.mb_qp_read_factor = (avc_state->mb_qp_data_enable || generic_state->mb_brc_enabled)?0:2;
3207 if(mbenc_i_frame_dist_in_use)
3209 cmd->dw13.qp_prime_y = 0;
3210 cmd->dw13.qp_prime_cb = 0;
3211 cmd->dw13.qp_prime_cr = 0;
3212 cmd->dw33.intra_16x16_nondc_penalty = 0;
3213 cmd->dw33.intra_8x8_nondc_penalty = 0;
3214 cmd->dw33.intra_4x4_nondc_penalty = 0;
3217 if(cmd->dw4.use_actual_ref_qp_value)
3219 cmd->dw44.actual_qp_value_for_ref_id0_list0 = gen9_avc_get_qp_from_ref_list(ctx,slice_param,0,0);
3220 cmd->dw44.actual_qp_value_for_ref_id1_list0 = gen9_avc_get_qp_from_ref_list(ctx,slice_param,0,1);
3221 cmd->dw44.actual_qp_value_for_ref_id2_list0 = gen9_avc_get_qp_from_ref_list(ctx,slice_param,0,2);
3222 cmd->dw44.actual_qp_value_for_ref_id3_list0 = gen9_avc_get_qp_from_ref_list(ctx,slice_param,0,3);
3223 cmd->dw45.actual_qp_value_for_ref_id4_list0 = gen9_avc_get_qp_from_ref_list(ctx,slice_param,0,4);
3224 cmd->dw45.actual_qp_value_for_ref_id5_list0 = gen9_avc_get_qp_from_ref_list(ctx,slice_param,0,5);
3225 cmd->dw45.actual_qp_value_for_ref_id6_list0 = gen9_avc_get_qp_from_ref_list(ctx,slice_param,0,6);
3226 cmd->dw45.actual_qp_value_for_ref_id7_list0 = gen9_avc_get_qp_from_ref_list(ctx,slice_param,0,7);
3227 cmd->dw46.actual_qp_value_for_ref_id0_list1 = gen9_avc_get_qp_from_ref_list(ctx,slice_param,1,0);
3228 cmd->dw46.actual_qp_value_for_ref_id1_list1 = gen9_avc_get_qp_from_ref_list(ctx,slice_param,1,1);
3231 table_idx = slice_type_kernel[generic_state->frame_type];
3232 cmd->dw46.ref_cost = gen9_avc_ref_cost[table_idx][qp];
3234 if(generic_state->frame_type == SLICE_TYPE_I)
3236 cmd->dw0.skip_mode_enable = 0;
3237 cmd->dw37.skip_mode_enable = 0;
3238 cmd->dw36.hme_combine_overlap = 0;
3239 cmd->dw47.intra_cost_sf = 16;
3240 cmd->dw34.enable_direct_bias_adjustment = 0;
3241 cmd->dw34.enable_global_motion_bias_adjustment = 0;
3243 }else if(generic_state->frame_type == SLICE_TYPE_P)
3245 cmd->dw1.max_num_mvs = i965_avc_get_max_mv_per_2mb(avc_state->seq_param->level_idc)/2;
3246 cmd->dw3.bme_disable_fbr = 1;
3247 cmd->dw5.ref_width = gen9_avc_search_x[preset];
3248 cmd->dw5.ref_height = gen9_avc_search_y[preset];
3249 cmd->dw7.non_skip_zmv_added = 1;
3250 cmd->dw7.non_skip_mode_added = 1;
3251 cmd->dw7.skip_center_mask = 1;
3252 cmd->dw47.intra_cost_sf = (avc_state->adaptive_intra_scaling_enable)?gen9_avc_adaptive_intra_scaling_factor[qp]:gen9_avc_intra_scaling_factor[qp];
3253 cmd->dw47.max_vmv_r = i965_avc_get_max_mv_len(avc_state->seq_param->level_idc) * 4;//frame onlys
3254 cmd->dw36.hme_combine_overlap = 1;
3255 cmd->dw36.num_ref_idx_l0_minus_one = (avc_state->multi_pre_enable)?slice_param->num_ref_idx_l0_active_minus1:0;
3256 cmd->dw39.ref_width = gen9_avc_search_x[preset];
3257 cmd->dw39.ref_height = gen9_avc_search_y[preset];
3258 cmd->dw34.enable_direct_bias_adjustment = 0;
3259 cmd->dw34.enable_global_motion_bias_adjustment = avc_state->global_motion_bias_adjustment_enable;
3260 if(avc_state->global_motion_bias_adjustment_enable)
3261 cmd->dw59.hme_mv_cost_scaling_factor = avc_state->hme_mv_cost_scaling_factor;
3265 cmd->dw1.max_num_mvs = i965_avc_get_max_mv_per_2mb(avc_state->seq_param->level_idc)/2;
3266 cmd->dw1.bi_weight = avc_state->bi_weight;
3267 cmd->dw3.search_ctrl = 7;
3268 cmd->dw3.skip_type = 1;
3269 cmd->dw5.ref_width = gen9_avc_b_search_x[preset];
3270 cmd->dw5.ref_height = gen9_avc_b_search_y[preset];
3271 cmd->dw7.skip_center_mask = 0xff;
3272 cmd->dw47.intra_cost_sf = (avc_state->adaptive_intra_scaling_enable)?gen9_avc_adaptive_intra_scaling_factor[qp]:gen9_avc_intra_scaling_factor[qp];
3273 cmd->dw47.max_vmv_r = i965_avc_get_max_mv_len(avc_state->seq_param->level_idc) * 4;//frame only
3274 cmd->dw36.hme_combine_overlap = 1;
3275 surface_id = slice_param->RefPicList1[0].picture_id;
3276 obj_surface = SURFACE(surface_id);
3279 WARN_ONCE("Invalid backward reference frame\n");
3282 cmd->dw36.is_fwd_frame_short_term_ref = !!( slice_param->RefPicList1[0].flags & VA_PICTURE_H264_SHORT_TERM_REFERENCE);
3284 cmd->dw36.num_ref_idx_l0_minus_one = (avc_state->multi_pre_enable)?slice_param->num_ref_idx_l0_active_minus1:0;
3285 cmd->dw36.num_ref_idx_l1_minus_one = (avc_state->multi_pre_enable)?slice_param->num_ref_idx_l1_active_minus1:0;
3286 cmd->dw39.ref_width = gen9_avc_b_search_x[preset];
3287 cmd->dw39.ref_height = gen9_avc_b_search_y[preset];
3288 cmd->dw40.dist_scale_factor_ref_id0_list0 = avc_state->dist_scale_factor_list0[0];
3289 cmd->dw40.dist_scale_factor_ref_id1_list0 = avc_state->dist_scale_factor_list0[1];
3290 cmd->dw41.dist_scale_factor_ref_id2_list0 = avc_state->dist_scale_factor_list0[2];
3291 cmd->dw41.dist_scale_factor_ref_id3_list0 = avc_state->dist_scale_factor_list0[3];
3292 cmd->dw42.dist_scale_factor_ref_id4_list0 = avc_state->dist_scale_factor_list0[4];
3293 cmd->dw42.dist_scale_factor_ref_id5_list0 = avc_state->dist_scale_factor_list0[5];
3294 cmd->dw43.dist_scale_factor_ref_id6_list0 = avc_state->dist_scale_factor_list0[6];
3295 cmd->dw43.dist_scale_factor_ref_id7_list0 = avc_state->dist_scale_factor_list0[7];
3297 cmd->dw34.enable_direct_bias_adjustment = avc_state->direct_bias_adjustment_enable;
3298 if(cmd->dw34.enable_direct_bias_adjustment)
3300 cmd->dw7.non_skip_zmv_added = 1;
3301 cmd->dw7.non_skip_mode_added = 1;
3304 cmd->dw34.enable_global_motion_bias_adjustment = avc_state->global_motion_bias_adjustment_enable;
3305 if(avc_state->global_motion_bias_adjustment_enable)
3306 cmd->dw59.hme_mv_cost_scaling_factor = avc_state->hme_mv_cost_scaling_factor;
3310 avc_state->block_based_skip_enable = cmd->dw3.block_based_skip_enable;
3312 if(avc_state->rolling_intra_refresh_enable)
3314 /*by now disable it*/
3315 cmd->dw34.widi_intra_refresh_en = avc_state->rolling_intra_refresh_enable;
3319 cmd->dw34.widi_intra_refresh_en = 0;
3322 cmd->dw34.enable_per_mb_static_check = avc_state->sfd_enable && generic_state->hme_enabled;
3323 cmd->dw34.enable_adaptive_search_window_size = avc_state->adaptive_search_window_enable;
3325 /*roi set disable by now. 49-56*/
3326 if(curbe_param->roi_enabled)
3328 cmd->dw49.roi_1_x_left = generic_state->roi[0].left;
3329 cmd->dw49.roi_1_y_top = generic_state->roi[0].top;
3330 cmd->dw50.roi_1_x_right = generic_state->roi[0].right;
3331 cmd->dw50.roi_1_y_bottom = generic_state->roi[0].bottom;
3333 cmd->dw51.roi_2_x_left = generic_state->roi[1].left;
3334 cmd->dw51.roi_2_y_top = generic_state->roi[1].top;
3335 cmd->dw52.roi_2_x_right = generic_state->roi[1].right;
3336 cmd->dw52.roi_2_y_bottom = generic_state->roi[1].bottom;
3338 cmd->dw53.roi_3_x_left = generic_state->roi[2].left;
3339 cmd->dw53.roi_3_y_top = generic_state->roi[2].top;
3340 cmd->dw54.roi_3_x_right = generic_state->roi[2].right;
3341 cmd->dw54.roi_3_y_bottom = generic_state->roi[2].bottom;
3343 cmd->dw55.roi_4_x_left = generic_state->roi[3].left;
3344 cmd->dw55.roi_4_y_top = generic_state->roi[3].top;
3345 cmd->dw56.roi_4_x_right = generic_state->roi[3].right;
3346 cmd->dw56.roi_4_y_bottom = generic_state->roi[3].bottom;
3348 if(!generic_state->brc_enabled)
3351 tmp = generic_state->roi[0].value;
3352 CLIP(tmp,-qp,52-qp);
3353 cmd->dw57.roi_1_dqp_prime_y = tmp;
3354 tmp = generic_state->roi[1].value;
3355 CLIP(tmp,-qp,52-qp);
3356 cmd->dw57.roi_2_dqp_prime_y = tmp;
3357 tmp = generic_state->roi[2].value;
3358 CLIP(tmp,-qp,52-qp);
3359 cmd->dw57.roi_3_dqp_prime_y = tmp;
3360 tmp = generic_state->roi[3].value;
3361 CLIP(tmp,-qp,52-qp);
3362 cmd->dw57.roi_4_dqp_prime_y = tmp;
3365 cmd->dw34.roi_enable_flag = 0;
3369 cmd->dw64.mb_data_surf_index = GEN9_AVC_MBENC_MFC_AVC_PAK_OBJ_INDEX;
3370 cmd->dw65.mv_data_surf_index = GEN9_AVC_MBENC_IND_MV_DATA_INDEX;
3371 cmd->dw66.i_dist_surf_index = GEN9_AVC_MBENC_BRC_DISTORTION_INDEX;
3372 cmd->dw67.src_y_surf_index = GEN9_AVC_MBENC_CURR_Y_INDEX;
3373 cmd->dw68.mb_specific_data_surf_index = GEN9_AVC_MBENC_MB_SPECIFIC_DATA_INDEX;
3374 cmd->dw69.aux_vme_out_surf_index = GEN9_AVC_MBENC_AUX_VME_OUT_INDEX;
3375 cmd->dw70.curr_ref_pic_sel_surf_index = GEN9_AVC_MBENC_REFPICSELECT_L0_INDEX;
3376 cmd->dw71.hme_mv_pred_fwd_bwd_surf_index = GEN9_AVC_MBENC_MV_DATA_FROM_ME_INDEX;
3377 cmd->dw72.hme_dist_surf_index = GEN9_AVC_MBENC_4XME_DISTORTION_INDEX;
3378 cmd->dw73.slice_map_surf_index = GEN9_AVC_MBENC_SLICEMAP_DATA_INDEX;
3379 cmd->dw74.fwd_frm_mb_data_surf_index = GEN9_AVC_MBENC_FWD_MB_DATA_INDEX;
3380 cmd->dw75.fwd_frm_mv_surf_index = GEN9_AVC_MBENC_FWD_MV_DATA_INDEX;
3381 cmd->dw76.mb_qp_buffer = GEN9_AVC_MBENC_MBQP_INDEX;
3382 cmd->dw77.mb_brc_lut = GEN9_AVC_MBENC_MBBRC_CONST_DATA_INDEX;
3383 cmd->dw78.vme_inter_prediction_surf_index = GEN9_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_0_INDEX;
3384 cmd->dw79.vme_inter_prediction_mr_surf_index = GEN9_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_1_INDEX;
3385 cmd->dw80.mb_stats_surf_index = GEN9_AVC_MBENC_MB_STATS_INDEX;
3386 cmd->dw81.mad_surf_index = GEN9_AVC_MBENC_MAD_DATA_INDEX;
3387 cmd->dw82.force_non_skip_mb_map_surface = GEN9_AVC_MBENC_FORCE_NONSKIP_MB_MAP_INDEX;
3388 cmd->dw83.widi_wa_surf_index = GEN9_AVC_MBENC_WIDI_WA_INDEX;
3389 cmd->dw84.brc_curbe_surf_index = GEN9_AVC_MBENC_BRC_CURBE_DATA_INDEX;
3390 cmd->dw85.static_detection_cost_table_index = GEN9_AVC_MBENC_SFD_COST_TABLE_INDEX;
3392 i965_gpe_context_unmap_curbe(gpe_context);
3398 gen9_avc_send_surface_mbenc(VADriverContextP ctx,
3399 struct encode_state *encode_state,
3400 struct i965_gpe_context *gpe_context,
3401 struct intel_encoder_context *encoder_context,
3404 struct i965_driver_data *i965 = i965_driver_data(ctx);
3405 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3406 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
3407 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
3408 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
3409 struct object_surface *obj_surface;
3410 struct gen9_surface_avc *avc_priv_surface;
3411 struct i965_gpe_resource *gpe_resource;
3412 struct mbenc_param * param = (struct mbenc_param *)param_mbenc ;
3413 VASurfaceID surface_id;
3414 unsigned int mbenc_i_frame_dist_in_use = param->mbenc_i_frame_dist_in_use;
3415 unsigned int size = 0;
3416 unsigned int w_mb = generic_state->frame_width_in_mbs;
3417 unsigned int h_mb = generic_state->frame_height_in_mbs;
3419 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
3421 obj_surface = encode_state->reconstructed_object;
3423 if (!obj_surface || !obj_surface->private_data)
3425 avc_priv_surface = obj_surface->private_data;
3427 /*pak obj command buffer output*/
3428 size = w_mb * h_mb * 16 * 4;
3429 gpe_resource = &avc_priv_surface->res_mb_code_surface;
3430 gen9_add_buffer_gpe_surface(ctx,
3436 GEN9_AVC_MBENC_MFC_AVC_PAK_OBJ_INDEX);
3438 /*mv data buffer output*/
3439 size = w_mb * h_mb * 32 * 4;
3440 gpe_resource = &avc_priv_surface->res_mv_data_surface;
3441 gen9_add_buffer_gpe_surface(ctx,
3447 GEN9_AVC_MBENC_IND_MV_DATA_INDEX);
3449 /*input current YUV surface, current input Y/UV object*/
3450 if(mbenc_i_frame_dist_in_use)
3452 obj_surface = encode_state->reconstructed_object;
3453 if (!obj_surface || !obj_surface->private_data)
3455 avc_priv_surface = obj_surface->private_data;
3456 obj_surface = avc_priv_surface->scaled_4x_surface_obj;
3459 obj_surface = encode_state->input_yuv_object;
3461 gen9_add_2d_gpe_surface(ctx,
3466 I965_SURFACEFORMAT_R8_UNORM,
3467 GEN9_AVC_MBENC_CURR_Y_INDEX);
3469 gen9_add_2d_gpe_surface(ctx,
3474 I965_SURFACEFORMAT_R16_UINT,
3475 GEN9_AVC_MBENC_CURR_UV_INDEX);
3477 if(generic_state->hme_enabled)
3480 gpe_resource = &(avc_ctx->s4x_memv_data_buffer);
3481 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3484 I965_SURFACEFORMAT_R8_UNORM,
3485 GEN9_AVC_MBENC_MV_DATA_FROM_ME_INDEX);
3486 /* memv distortion input*/
3487 gpe_resource = &(avc_ctx->s4x_memv_distortion_buffer);
3488 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3491 I965_SURFACEFORMAT_R8_UNORM,
3492 GEN9_AVC_MBENC_4XME_DISTORTION_INDEX);
3495 /*mbbrc const data_buffer*/
3496 if(param->mb_const_data_buffer_in_use)
3498 size = 16 * 52 * sizeof(unsigned int);
3499 gpe_resource = &avc_ctx->res_mbbrc_const_data_buffer;
3500 gen9_add_buffer_gpe_surface(ctx,
3506 GEN9_AVC_MBENC_MBBRC_CONST_DATA_INDEX);
3510 /*mb qp data_buffer*/
3511 if(param->mb_qp_buffer_in_use)
3513 if(avc_state->mb_qp_data_enable)
3514 gpe_resource = &(avc_ctx->res_mb_qp_data_surface);
3516 gpe_resource = &(avc_ctx->res_mbbrc_mb_qp_data_surface);
3517 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3520 I965_SURFACEFORMAT_R8_UNORM,
3521 GEN9_AVC_MBENC_MBQP_INDEX);
3524 /*input current YUV surface, current input Y/UV object*/
3525 if(mbenc_i_frame_dist_in_use)
3527 obj_surface = encode_state->reconstructed_object;
3528 if (!obj_surface || !obj_surface->private_data)
3530 avc_priv_surface = obj_surface->private_data;
3531 obj_surface = avc_priv_surface->scaled_4x_surface_obj;
3534 obj_surface = encode_state->input_yuv_object;
3536 gen9_add_adv_gpe_surface(ctx, gpe_context,
3538 GEN9_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_0_INDEX);
3539 /*input ref YUV surface*/
3540 for(i = 0; i < slice_param->num_ref_idx_l0_active_minus1 + 1; i++)
3542 surface_id = slice_param->RefPicList0[i].picture_id;
3543 obj_surface = SURFACE(surface_id);
3544 if (!obj_surface || !obj_surface->private_data)
3547 gen9_add_adv_gpe_surface(ctx, gpe_context,
3549 GEN9_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_0_INDEX+i*2 + 1);
3551 /*input current YUV surface, current input Y/UV object*/
3552 if(mbenc_i_frame_dist_in_use)
3554 obj_surface = encode_state->reconstructed_object;
3555 if (!obj_surface || !obj_surface->private_data)
3557 avc_priv_surface = obj_surface->private_data;
3558 obj_surface = avc_priv_surface->scaled_4x_surface_obj;
3561 obj_surface = encode_state->input_yuv_object;
3563 gen9_add_adv_gpe_surface(ctx, gpe_context,
3565 GEN9_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_1_INDEX);
3567 for(i = 0; i < slice_param->num_ref_idx_l1_active_minus1 + 1; i++)
3569 if(i > 0) break;// only one ref supported here for B frame
3570 surface_id = slice_param->RefPicList1[i].picture_id;
3571 obj_surface = SURFACE(surface_id);
3572 if (!obj_surface || !obj_surface->private_data)
3575 gen9_add_adv_gpe_surface(ctx, gpe_context,
3577 GEN9_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_1_INDEX+i*2 + 1);
3578 gen9_add_adv_gpe_surface(ctx, gpe_context,
3580 GEN9_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_0_INDEX+i*2 + 2);
3583 avc_priv_surface = obj_surface->private_data;
3584 /*pak obj command buffer output(mb code)*/
3585 size = w_mb * h_mb * 16 * 4;
3586 gpe_resource = &avc_priv_surface->res_mb_code_surface;
3587 gen9_add_buffer_gpe_surface(ctx,
3593 GEN9_AVC_MBENC_FWD_MB_DATA_INDEX);
3595 /*mv data buffer output*/
3596 size = w_mb * h_mb * 32 * 4;
3597 gpe_resource = &avc_priv_surface->res_mv_data_surface;
3598 gen9_add_buffer_gpe_surface(ctx,
3604 GEN9_AVC_MBENC_FWD_MV_DATA_INDEX);
3608 if( i < INTEL_AVC_MAX_BWD_REF_NUM)
3610 gen9_add_adv_gpe_surface(ctx, gpe_context,
3612 GEN9_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_1_INDEX+i*2 + 1 + INTEL_AVC_MAX_BWD_REF_NUM);
3617 /* BRC distortion data buffer for I frame*/
3618 if(mbenc_i_frame_dist_in_use)
3620 gpe_resource = &(avc_ctx->res_brc_dist_data_surface);
3621 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3624 I965_SURFACEFORMAT_R8_UNORM,
3625 GEN9_AVC_MBENC_BRC_DISTORTION_INDEX);
3628 /* as ref frame ,update later RefPicSelect of Current Picture*/
3629 obj_surface = encode_state->reconstructed_object;
3630 avc_priv_surface = obj_surface->private_data;
3631 if(avc_state->ref_pic_select_list_supported && avc_priv_surface->is_as_ref)
3633 gpe_resource = &(avc_priv_surface->res_ref_pic_select_surface);
3634 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3637 I965_SURFACEFORMAT_R8_UNORM,
3638 GEN9_AVC_MBENC_REFPICSELECT_L0_INDEX);
3642 if(param->mb_vproc_stats_enable)
3644 /*mb status buffer input*/
3645 size = w_mb * h_mb * 16 * 4;
3646 gpe_resource = &(avc_ctx->res_mb_status_buffer);
3647 gen9_add_buffer_gpe_surface(ctx,
3653 GEN9_AVC_MBENC_MB_STATS_INDEX);
3655 }else if(avc_state->flatness_check_enable)
3658 gpe_resource = &(avc_ctx->res_flatness_check_surface);
3659 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3662 I965_SURFACEFORMAT_R8_UNORM,
3663 GEN9_AVC_MBENC_MB_STATS_INDEX);
3666 if(param->mad_enable)
3668 /*mad buffer input*/
3670 gpe_resource = &(avc_ctx->res_mad_data_buffer);
3671 gen9_add_buffer_gpe_surface(ctx,
3677 GEN9_AVC_MBENC_MAD_DATA_INDEX);
3678 i965_zero_gpe_resource(gpe_resource);
3681 /*brc updated mbenc curbe data buffer,it is ignored*/
3683 /*artitratry num mbs in slice*/
3684 if(avc_state->arbitrary_num_mbs_in_slice)
3686 /*slice surface input*/
3687 gpe_resource = &(avc_ctx->res_mbenc_slice_map_surface);
3688 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3691 I965_SURFACEFORMAT_R8_UNORM,
3692 GEN9_AVC_MBENC_SLICEMAP_DATA_INDEX);
3695 /* BRC distortion data buffer for I frame */
3696 if(!mbenc_i_frame_dist_in_use)
3698 if(avc_state->mb_disable_skip_map_enable)
3700 gpe_resource = &(avc_ctx->res_mb_disable_skip_map_surface);
3701 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3704 I965_SURFACEFORMAT_R8_UNORM,
3705 GEN9_AVC_MBENC_FORCE_NONSKIP_MB_MAP_INDEX);
3708 if(avc_state->sfd_enable && generic_state->hme_enabled)
3710 if(generic_state->frame_type == SLICE_TYPE_P)
3712 gpe_resource = &(avc_ctx->res_sfd_cost_table_p_frame_buffer);
3714 }else if(generic_state->frame_type == SLICE_TYPE_B)
3716 gpe_resource = &(avc_ctx->res_sfd_cost_table_b_frame_buffer);
3719 if(generic_state->frame_type != SLICE_TYPE_I)
3721 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3724 I965_SURFACEFORMAT_R8_UNORM,
3725 GEN9_AVC_MBENC_SFD_COST_TABLE_INDEX);
3734 gen9_avc_kernel_mbenc(VADriverContextP ctx,
3735 struct encode_state *encode_state,
3736 struct intel_encoder_context *encoder_context,
3737 bool i_frame_dist_in_use)
3739 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3740 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
3741 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
3742 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
3743 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
3745 struct i965_gpe_context *gpe_context;
3746 struct gpe_media_object_walker_parameter media_object_walker_param;
3747 struct gpe_encoder_kernel_walker_parameter kernel_walker_param;
3748 unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
3749 int media_function = 0;
3751 unsigned int mb_const_data_buffer_in_use = 0;
3752 unsigned int mb_qp_buffer_in_use = 0;
3753 unsigned int brc_enabled = 0;
3754 unsigned int roi_enable = (generic_state->num_roi > 0)?1:0;
3755 unsigned int dirty_roi_enable = ((generic_state->dirty_num_roi > 0) && (generic_state->frame_type == SLICE_TYPE_P) && (0));
3756 struct mbenc_param param ;
3758 int mbenc_i_frame_dist_in_use = i_frame_dist_in_use;
3760 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
3762 mb_const_data_buffer_in_use =
3763 generic_state->mb_brc_enabled ||
3766 avc_state->mb_qp_data_enable ||
3767 avc_state->rolling_intra_refresh_enable;
3768 mb_qp_buffer_in_use =
3769 generic_state->mb_brc_enabled ||
3770 generic_state->brc_roi_enable ||
3771 avc_state->mb_qp_data_enable;
3773 if(mbenc_i_frame_dist_in_use)
3775 media_function = INTEL_MEDIA_STATE_ENC_I_FRAME_DIST;
3776 kernel_idx = GEN9_AVC_KERNEL_BRC_I_FRAME_DIST;
3777 downscaled_width_in_mb = generic_state->downscaled_width_4x_in_mb;
3778 downscaled_height_in_mb = generic_state->downscaled_height_4x_in_mb;
3782 gpe_context = &(avc_ctx->context_brc.gpe_contexts[kernel_idx]);
3785 switch(generic_state->kernel_mode)
3787 case INTEL_ENC_KERNEL_NORMAL :
3789 media_function = INTEL_MEDIA_STATE_ENC_NORMAL;
3790 kernel_idx = MBENC_KERNEL_BASE + GEN9_AVC_KERNEL_MBENC_NORMAL_I;
3793 case INTEL_ENC_KERNEL_PERFORMANCE :
3795 media_function = INTEL_MEDIA_STATE_ENC_PERFORMANCE;
3796 kernel_idx = MBENC_KERNEL_BASE + GEN9_AVC_KERNEL_MBENC_PERFORMANCE_I;
3799 case INTEL_ENC_KERNEL_QUALITY :
3801 media_function = INTEL_MEDIA_STATE_ENC_QUALITY;
3802 kernel_idx = MBENC_KERNEL_BASE + GEN9_AVC_KERNEL_MBENC_QUALITY_I;
3810 if(generic_state->frame_type == SLICE_TYPE_P)
3814 else if(generic_state->frame_type == SLICE_TYPE_B)
3819 downscaled_width_in_mb = generic_state->frame_width_in_mbs;
3820 downscaled_height_in_mb = generic_state->frame_height_in_mbs;
3821 mad_enable = avc_state->mad_enable;
3822 brc_enabled = generic_state->brc_enabled;
3824 gpe_context = &(avc_ctx->context_mbenc.gpe_contexts[kernel_idx]);
3827 memset(¶m,0,sizeof(struct mbenc_param));
3829 param.mb_const_data_buffer_in_use = mb_const_data_buffer_in_use;
3830 param.mb_qp_buffer_in_use = mb_qp_buffer_in_use;
3831 param.mbenc_i_frame_dist_in_use = mbenc_i_frame_dist_in_use;
3832 param.mad_enable = mad_enable;
3833 param.brc_enabled = brc_enabled;
3834 param.roi_enabled = roi_enable;
3836 if(avc_state->mb_status_supported)
3838 param.mb_vproc_stats_enable = avc_state->flatness_check_enable || avc_state->adaptive_transform_decision_enable;
3841 if(!avc_state->mbenc_curbe_set_in_brc_update)
3843 gen8_gpe_context_init(ctx, gpe_context);
3846 gen9_gpe_reset_binding_table(ctx, gpe_context);
3848 if(!avc_state->mbenc_curbe_set_in_brc_update)
3851 generic_ctx->pfn_set_curbe_mbenc(ctx,encode_state,gpe_context,encoder_context,¶m);
3854 /* MB brc const data buffer set up*/
3855 if(mb_const_data_buffer_in_use)
3857 gen9_avc_load_mb_brc_const_data(ctx,encode_state,encoder_context);
3860 /*clear the mad buffer*/
3863 i965_zero_gpe_resource(&(avc_ctx->res_mad_data_buffer));
3866 generic_ctx->pfn_send_mbenc_surface(ctx,encode_state,gpe_context,encoder_context,¶m);
3868 gen8_gpe_setup_interface_data(ctx, gpe_context);
3871 memset(&kernel_walker_param, 0, sizeof(kernel_walker_param));
3873 kernel_walker_param.use_scoreboard = 1;
3874 kernel_walker_param.resolution_x = downscaled_width_in_mb ;
3875 kernel_walker_param.resolution_y = downscaled_height_in_mb ;
3876 if(mbenc_i_frame_dist_in_use)
3878 kernel_walker_param.no_dependency = 1;
3881 switch(generic_state->frame_type)
3884 kernel_walker_param.walker_degree = WALKER_45_DEGREE;
3887 kernel_walker_param.walker_degree = WALKER_26_DEGREE;
3890 kernel_walker_param.walker_degree = WALKER_26_DEGREE;
3891 if(!slice_param->direct_spatial_mv_pred_flag)
3893 kernel_walker_param.walker_degree = WALKER_45_DEGREE;
3899 kernel_walker_param.no_dependency = 0;
3902 i965_init_media_object_walker_parameter(&kernel_walker_param, &media_object_walker_param);
3904 gen9_avc_run_kernel_media_object_walker(ctx, encoder_context,
3907 &media_object_walker_param);
3908 return VA_STATUS_SUCCESS;
3912 me kernle related function
3915 gen9_avc_set_curbe_me(VADriverContextP ctx,
3916 struct encode_state *encode_state,
3917 struct i965_gpe_context *gpe_context,
3918 struct intel_encoder_context *encoder_context,
3921 gen9_avc_me_curbe_data *curbe_cmd;
3922 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3923 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
3924 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
3926 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
3928 struct me_param * curbe_param = (struct me_param *)param ;
3929 unsigned char use_mv_from_prev_step = 0;
3930 unsigned char write_distortions = 0;
3931 unsigned char qp_prime_y = 0;
3932 unsigned char me_method = gen9_avc_p_me_method[generic_state->preset];
3933 unsigned char seach_table_idx = 0;
3934 unsigned char mv_shift_factor = 0, prev_mv_read_pos_factor = 0;
3935 unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
3936 unsigned int scale_factor = 0;
3938 qp_prime_y = avc_state->pic_param->pic_init_qp + slice_param->slice_qp_delta;
3939 switch(curbe_param->hme_type)
3941 case INTEL_ENC_HME_4x :
3943 use_mv_from_prev_step = (generic_state->b16xme_enabled)? 1:0;
3944 write_distortions = 1;
3945 mv_shift_factor = 2;
3947 prev_mv_read_pos_factor = 0;
3950 case INTEL_ENC_HME_16x :
3952 use_mv_from_prev_step = (generic_state->b32xme_enabled)? 1:0;
3953 write_distortions = 0;
3954 mv_shift_factor = 2;
3956 prev_mv_read_pos_factor = 1;
3959 case INTEL_ENC_HME_32x :
3961 use_mv_from_prev_step = 0;
3962 write_distortions = 0;
3963 mv_shift_factor = 1;
3965 prev_mv_read_pos_factor = 0;
3972 curbe_cmd = i965_gpe_context_map_curbe(gpe_context);
3977 downscaled_width_in_mb = ALIGN(generic_state->frame_width_in_pixel/scale_factor,16)/16;
3978 downscaled_height_in_mb = ALIGN(generic_state->frame_height_in_pixel/scale_factor,16)/16;
3980 memcpy(curbe_cmd,gen9_avc_me_curbe_init_data,sizeof(gen9_avc_me_curbe_data));
3982 curbe_cmd->dw3.sub_pel_mode = 3;
3983 if(avc_state->field_scaling_output_interleaved)
3985 /*frame set to zero,field specified*/
3986 curbe_cmd->dw3.src_access = 0;
3987 curbe_cmd->dw3.ref_access = 0;
3988 curbe_cmd->dw7.src_field_polarity = 0;
3990 curbe_cmd->dw4.picture_height_minus1 = downscaled_height_in_mb - 1;
3991 curbe_cmd->dw4.picture_width = downscaled_width_in_mb;
3992 curbe_cmd->dw5.qp_prime_y = qp_prime_y;
3994 curbe_cmd->dw6.use_mv_from_prev_step = use_mv_from_prev_step;
3995 curbe_cmd->dw6.write_distortions = write_distortions;
3996 curbe_cmd->dw6.super_combine_dist = gen9_avc_super_combine_dist[generic_state->preset];
3997 curbe_cmd->dw6.max_vmvr = i965_avc_get_max_mv_len(avc_state->seq_param->level_idc) * 4;//frame only
3999 if(generic_state->frame_type == SLICE_TYPE_B)
4001 curbe_cmd->dw1.bi_weight = 32;
4002 curbe_cmd->dw13.num_ref_idx_l1_minus1 = slice_param->num_ref_idx_l1_active_minus1;
4003 me_method = gen9_avc_b_me_method[generic_state->preset];
4004 seach_table_idx = 1;
4007 if(generic_state->frame_type == SLICE_TYPE_P ||
4008 generic_state->frame_type == SLICE_TYPE_B )
4009 curbe_cmd->dw13.num_ref_idx_l0_minus1 = slice_param->num_ref_idx_l0_active_minus1;
4011 curbe_cmd->dw13.ref_streamin_cost = 5;
4012 curbe_cmd->dw13.roi_enable = 0;
4014 curbe_cmd->dw15.prev_mv_read_pos_factor = prev_mv_read_pos_factor;
4015 curbe_cmd->dw15.mv_shift_factor = mv_shift_factor;
4017 memcpy(&curbe_cmd->dw16,table_enc_search_path[seach_table_idx][me_method],14*sizeof(int));
4019 curbe_cmd->dw32._4x_memv_output_data_surf_index = GEN9_AVC_ME_MV_DATA_SURFACE_INDEX;
4020 curbe_cmd->dw33._16x_32x_memv_input_data_surf_index = (curbe_param->hme_type == INTEL_ENC_HME_32x)? GEN9_AVC_32XME_MV_DATA_SURFACE_INDEX:GEN9_AVC_16XME_MV_DATA_SURFACE_INDEX ;
4021 curbe_cmd->dw34._4x_me_output_dist_surf_index = GEN9_AVC_ME_DISTORTION_SURFACE_INDEX;
4022 curbe_cmd->dw35._4x_me_output_brc_dist_surf_index = GEN9_AVC_ME_BRC_DISTORTION_INDEX;
4023 curbe_cmd->dw36.vme_fwd_inter_pred_surf_index = GEN9_AVC_ME_CURR_FOR_FWD_REF_INDEX;
4024 curbe_cmd->dw37.vme_bdw_inter_pred_surf_index = GEN9_AVC_ME_CURR_FOR_BWD_REF_INDEX;
4025 curbe_cmd->dw38.reserved = GEN9_AVC_ME_VDENC_STREAMIN_INDEX;
4027 i965_gpe_context_unmap_curbe(gpe_context);
4032 gen9_avc_send_surface_me(VADriverContextP ctx,
4033 struct encode_state *encode_state,
4034 struct i965_gpe_context *gpe_context,
4035 struct intel_encoder_context *encoder_context,
4038 struct i965_driver_data *i965 = i965_driver_data(ctx);
4040 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4041 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
4042 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
4043 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
4045 struct object_surface *obj_surface, *input_surface;
4046 struct gen9_surface_avc *avc_priv_surface;
4047 struct i965_gpe_resource *gpe_resource;
4048 struct me_param * curbe_param = (struct me_param *)param ;
4050 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
4051 VASurfaceID surface_id;
4054 /* all scaled input surface stored in reconstructed_object*/
4055 obj_surface = encode_state->reconstructed_object;
4056 if (!obj_surface || !obj_surface->private_data)
4058 avc_priv_surface = obj_surface->private_data;
4061 switch(curbe_param->hme_type)
4063 case INTEL_ENC_HME_4x :
4066 gpe_resource = &avc_ctx->s4x_memv_data_buffer;
4067 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
4070 I965_SURFACEFORMAT_R8_UNORM,
4071 GEN9_AVC_ME_MV_DATA_SURFACE_INDEX);
4074 if(generic_state->b16xme_enabled)
4076 gpe_resource = &avc_ctx->s16x_memv_data_buffer;
4077 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
4080 I965_SURFACEFORMAT_R8_UNORM,
4081 GEN9_AVC_16XME_MV_DATA_SURFACE_INDEX);
4083 /* brc distortion output*/
4084 gpe_resource = &avc_ctx->res_brc_dist_data_surface;
4085 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
4088 I965_SURFACEFORMAT_R8_UNORM,
4089 GEN9_AVC_ME_BRC_DISTORTION_INDEX);
4090 /* memv distortion output*/
4091 gpe_resource = &avc_ctx->s4x_memv_distortion_buffer;
4092 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
4095 I965_SURFACEFORMAT_R8_UNORM,
4096 GEN9_AVC_ME_DISTORTION_SURFACE_INDEX);
4097 /*input current down scaled YUV surface*/
4098 obj_surface = encode_state->reconstructed_object;
4099 avc_priv_surface = obj_surface->private_data;
4100 input_surface = avc_priv_surface->scaled_4x_surface_obj;
4101 gen9_add_adv_gpe_surface(ctx, gpe_context,
4103 GEN9_AVC_ME_CURR_FOR_FWD_REF_INDEX);
4104 /*input ref scaled YUV surface*/
4105 for(i = 0; i < slice_param->num_ref_idx_l0_active_minus1 + 1; i++)
4107 surface_id = slice_param->RefPicList0[i].picture_id;
4108 obj_surface = SURFACE(surface_id);
4109 if (!obj_surface || !obj_surface->private_data)
4111 avc_priv_surface = obj_surface->private_data;
4113 input_surface = avc_priv_surface->scaled_4x_surface_obj;
4115 gen9_add_adv_gpe_surface(ctx, gpe_context,
4117 GEN9_AVC_ME_CURR_FOR_FWD_REF_INDEX+i*2 + 1);
4120 obj_surface = encode_state->reconstructed_object;
4121 avc_priv_surface = obj_surface->private_data;
4122 input_surface = avc_priv_surface->scaled_4x_surface_obj;
4124 gen9_add_adv_gpe_surface(ctx, gpe_context,
4126 GEN9_AVC_ME_CURR_FOR_BWD_REF_INDEX);
4128 for(i = 0; i < slice_param->num_ref_idx_l1_active_minus1 + 1; i++)
4130 surface_id = slice_param->RefPicList1[i].picture_id;
4131 obj_surface = SURFACE(surface_id);
4132 if (!obj_surface || !obj_surface->private_data)
4134 avc_priv_surface = obj_surface->private_data;
4136 input_surface = avc_priv_surface->scaled_4x_surface_obj;
4138 gen9_add_adv_gpe_surface(ctx, gpe_context,
4140 GEN9_AVC_ME_CURR_FOR_BWD_REF_INDEX+i*2 + 1);
4145 case INTEL_ENC_HME_16x :
4147 gpe_resource = &avc_ctx->s16x_memv_data_buffer;
4148 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
4151 I965_SURFACEFORMAT_R8_UNORM,
4152 GEN9_AVC_ME_MV_DATA_SURFACE_INDEX);
4154 if(generic_state->b32xme_enabled)
4156 gpe_resource = &avc_ctx->s32x_memv_data_buffer;
4157 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
4160 I965_SURFACEFORMAT_R8_UNORM,
4161 GEN9_AVC_32XME_MV_DATA_SURFACE_INDEX);
4164 obj_surface = encode_state->reconstructed_object;
4165 avc_priv_surface = obj_surface->private_data;
4166 input_surface = avc_priv_surface->scaled_16x_surface_obj;
4167 gen9_add_adv_gpe_surface(ctx, gpe_context,
4169 GEN9_AVC_ME_CURR_FOR_FWD_REF_INDEX);
4171 for(i = 0; i < slice_param->num_ref_idx_l0_active_minus1 + 1; i++)
4173 surface_id = slice_param->RefPicList0[i].picture_id;
4174 obj_surface = SURFACE(surface_id);
4175 if (!obj_surface || !obj_surface->private_data)
4177 avc_priv_surface = obj_surface->private_data;
4179 input_surface = avc_priv_surface->scaled_16x_surface_obj;
4181 gen9_add_adv_gpe_surface(ctx, gpe_context,
4183 GEN9_AVC_ME_CURR_FOR_FWD_REF_INDEX+i*2 + 1);
4186 obj_surface = encode_state->reconstructed_object;
4187 avc_priv_surface = obj_surface->private_data;
4188 input_surface = avc_priv_surface->scaled_16x_surface_obj;
4190 gen9_add_adv_gpe_surface(ctx, gpe_context,
4192 GEN9_AVC_ME_CURR_FOR_BWD_REF_INDEX);
4194 for(i = 0; i < slice_param->num_ref_idx_l1_active_minus1 + 1; i++)
4196 surface_id = slice_param->RefPicList1[i].picture_id;
4197 obj_surface = SURFACE(surface_id);
4198 if (!obj_surface || !obj_surface->private_data)
4200 avc_priv_surface = obj_surface->private_data;
4202 input_surface = avc_priv_surface->scaled_16x_surface_obj;
4204 gen9_add_adv_gpe_surface(ctx, gpe_context,
4206 GEN9_AVC_ME_CURR_FOR_BWD_REF_INDEX+i*2 + 1);
4210 case INTEL_ENC_HME_32x :
4212 gpe_resource = &avc_ctx->s32x_memv_data_buffer;
4213 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
4216 I965_SURFACEFORMAT_R8_UNORM,
4217 GEN9_AVC_ME_MV_DATA_SURFACE_INDEX);
4219 obj_surface = encode_state->reconstructed_object;
4220 avc_priv_surface = obj_surface->private_data;
4221 input_surface = avc_priv_surface->scaled_32x_surface_obj;
4222 gen9_add_adv_gpe_surface(ctx, gpe_context,
4224 GEN9_AVC_ME_CURR_FOR_FWD_REF_INDEX);
4226 for(i = 0; i < slice_param->num_ref_idx_l0_active_minus1 + 1; i++)
4228 surface_id = slice_param->RefPicList0[i].picture_id;
4229 obj_surface = SURFACE(surface_id);
4230 if (!obj_surface || !obj_surface->private_data)
4232 avc_priv_surface = obj_surface->private_data;
4234 input_surface = avc_priv_surface->scaled_32x_surface_obj;
4236 gen9_add_adv_gpe_surface(ctx, gpe_context,
4238 GEN9_AVC_ME_CURR_FOR_FWD_REF_INDEX+i*2 + 1);
4241 obj_surface = encode_state->reconstructed_object;
4242 avc_priv_surface = obj_surface->private_data;
4243 input_surface = avc_priv_surface->scaled_32x_surface_obj;
4245 gen9_add_adv_gpe_surface(ctx, gpe_context,
4247 GEN9_AVC_ME_CURR_FOR_BWD_REF_INDEX);
4249 for(i = 0; i < slice_param->num_ref_idx_l1_active_minus1 + 1; i++)
4251 surface_id = slice_param->RefPicList1[i].picture_id;
4252 obj_surface = SURFACE(surface_id);
4253 if (!obj_surface || !obj_surface->private_data)
4255 avc_priv_surface = obj_surface->private_data;
4257 input_surface = avc_priv_surface->scaled_32x_surface_obj;
4259 gen9_add_adv_gpe_surface(ctx, gpe_context,
4261 GEN9_AVC_ME_CURR_FOR_BWD_REF_INDEX+i*2 + 1);
4272 gen9_avc_kernel_me(VADriverContextP ctx,
4273 struct encode_state *encode_state,
4274 struct intel_encoder_context *encoder_context,
4277 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4278 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
4279 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
4280 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
4282 struct i965_gpe_context *gpe_context;
4283 struct gpe_media_object_walker_parameter media_object_walker_param;
4284 struct gpe_encoder_kernel_walker_parameter kernel_walker_param;
4285 unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
4286 int media_function = 0;
4288 struct me_param param ;
4289 unsigned int scale_factor = 0;
4293 case INTEL_ENC_HME_4x :
4295 media_function = INTEL_MEDIA_STATE_4X_ME;
4299 case INTEL_ENC_HME_16x :
4301 media_function = INTEL_MEDIA_STATE_16X_ME;
4305 case INTEL_ENC_HME_32x :
4307 media_function = INTEL_MEDIA_STATE_32X_ME;
4316 downscaled_width_in_mb = ALIGN(generic_state->frame_width_in_pixel/scale_factor,16)/16;
4317 downscaled_height_in_mb = ALIGN(generic_state->frame_height_in_pixel/scale_factor,16)/16;
4319 /* I frame should not come here.*/
4320 kernel_idx = (generic_state->frame_type == SLICE_TYPE_P)? GEN9_AVC_KERNEL_ME_P_IDX : GEN9_AVC_KERNEL_ME_B_IDX;
4321 gpe_context = &(avc_ctx->context_me.gpe_contexts[kernel_idx]);
4323 gen8_gpe_context_init(ctx, gpe_context);
4324 gen9_gpe_reset_binding_table(ctx, gpe_context);
4327 memset(¶m,0,sizeof(param));
4328 param.hme_type = hme_type;
4329 generic_ctx->pfn_set_curbe_me(ctx,encode_state,gpe_context,encoder_context,¶m);
4332 generic_ctx->pfn_send_me_surface(ctx,encode_state,gpe_context,encoder_context,¶m);
4334 gen8_gpe_setup_interface_data(ctx, gpe_context);
4336 memset(&kernel_walker_param, 0, sizeof(kernel_walker_param));
4337 /* the scaling is based on 8x8 blk level */
4338 kernel_walker_param.resolution_x = downscaled_width_in_mb ;
4339 kernel_walker_param.resolution_y = downscaled_height_in_mb ;
4340 kernel_walker_param.no_dependency = 1;
4342 i965_init_media_object_walker_parameter(&kernel_walker_param, &media_object_walker_param);
4344 gen9_avc_run_kernel_media_object_walker(ctx, encoder_context,
4347 &media_object_walker_param);
4349 return VA_STATUS_SUCCESS;
4356 gen9_avc_set_curbe_wp(VADriverContextP ctx,
4357 struct encode_state *encode_state,
4358 struct i965_gpe_context *gpe_context,
4359 struct intel_encoder_context *encoder_context,
4362 gen9_avc_wp_curbe_data *cmd;
4363 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4364 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
4365 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
4366 struct wp_param * curbe_param = (struct wp_param *)param;
4368 cmd = i965_gpe_context_map_curbe(gpe_context);
4372 memset(cmd,0,sizeof(gen9_avc_wp_curbe_data));
4373 if(curbe_param->ref_list_idx)
4375 cmd->dw0.default_weight = slice_param->luma_weight_l1[0];
4376 cmd->dw0.default_offset = slice_param->luma_offset_l1[0];
4379 cmd->dw0.default_weight = slice_param->luma_weight_l0[0];
4380 cmd->dw0.default_offset = slice_param->luma_offset_l0[0];
4383 cmd->dw49.input_surface = GEN9_AVC_WP_INPUT_REF_SURFACE_INDEX;
4384 cmd->dw50.output_surface = GEN9_AVC_WP_OUTPUT_SCALED_SURFACE_INDEX;
4386 i965_gpe_context_unmap_curbe(gpe_context);
4391 gen9_avc_send_surface_wp(VADriverContextP ctx,
4392 struct encode_state *encode_state,
4393 struct i965_gpe_context *gpe_context,
4394 struct intel_encoder_context *encoder_context,
4397 struct i965_driver_data *i965 = i965_driver_data(ctx);
4398 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4399 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
4400 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
4401 struct wp_param * curbe_param = (struct wp_param *)param;
4402 struct object_surface *obj_surface;
4403 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
4404 VASurfaceID surface_id;
4406 if(curbe_param->ref_list_idx)
4408 surface_id = slice_param->RefPicList1[0].picture_id;
4409 obj_surface = SURFACE(surface_id);
4410 if (!obj_surface || !obj_surface->private_data)
4411 avc_state->weighted_ref_l1_enable = 0;
4413 avc_state->weighted_ref_l1_enable = 1;
4416 surface_id = slice_param->RefPicList0[0].picture_id;
4417 obj_surface = SURFACE(surface_id);
4418 if (!obj_surface || !obj_surface->private_data)
4419 avc_state->weighted_ref_l0_enable = 0;
4421 avc_state->weighted_ref_l0_enable = 1;
4424 obj_surface = encode_state->reference_objects[0];
4427 gen9_add_adv_gpe_surface(ctx, gpe_context,
4429 GEN9_AVC_WP_INPUT_REF_SURFACE_INDEX);
4431 obj_surface = avc_ctx->wp_output_pic_select_surface_obj[curbe_param->ref_list_idx];
4432 gen9_add_adv_gpe_surface(ctx, gpe_context,
4434 GEN9_AVC_WP_OUTPUT_SCALED_SURFACE_INDEX);
4439 gen9_avc_kernel_wp(VADriverContextP ctx,
4440 struct encode_state *encode_state,
4441 struct intel_encoder_context *encoder_context,
4442 unsigned int list1_in_use)
4444 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4445 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
4446 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
4447 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
4449 struct i965_gpe_context *gpe_context;
4450 struct gpe_media_object_walker_parameter media_object_walker_param;
4451 struct gpe_encoder_kernel_walker_parameter kernel_walker_param;
4452 int media_function = INTEL_MEDIA_STATE_ENC_WP;
4453 struct wp_param param;
4455 gpe_context = &(avc_ctx->context_wp.gpe_contexts);
4457 gen8_gpe_context_init(ctx, gpe_context);
4458 gen9_gpe_reset_binding_table(ctx, gpe_context);
4460 memset(¶m,0,sizeof(param));
4461 param.ref_list_idx = (list1_in_use == 1)? 1: 0;
4463 generic_ctx->pfn_set_curbe_wp(ctx,encode_state,gpe_context,encoder_context,¶m);
4466 generic_ctx->pfn_send_wp_surface(ctx,encode_state,gpe_context,encoder_context,¶m);
4468 gen8_gpe_setup_interface_data(ctx, gpe_context);
4470 memset(&kernel_walker_param, 0, sizeof(kernel_walker_param));
4471 /* the scaling is based on 8x8 blk level */
4472 kernel_walker_param.resolution_x = generic_state->frame_width_in_mbs;
4473 kernel_walker_param.resolution_y = generic_state->frame_height_in_mbs;
4474 kernel_walker_param.no_dependency = 1;
4476 i965_init_media_object_walker_parameter(&kernel_walker_param, &media_object_walker_param);
4478 gen9_avc_run_kernel_media_object_walker(ctx, encoder_context,
4481 &media_object_walker_param);
4483 return VA_STATUS_SUCCESS;
4488 sfd related function
4491 gen9_avc_set_curbe_sfd(VADriverContextP ctx,
4492 struct encode_state *encode_state,
4493 struct i965_gpe_context *gpe_context,
4494 struct intel_encoder_context *encoder_context,
4497 gen9_avc_sfd_curbe_data *cmd;
4498 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4499 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
4500 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
4501 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
4503 cmd = i965_gpe_context_map_curbe(gpe_context);
4507 memset(cmd,0,sizeof(gen9_avc_sfd_curbe_data));
4509 cmd->dw0.enable_intra_cost_scaling_for_static_frame = 1 ;
4510 cmd->dw0.enable_adaptive_mv_stream_in = 0 ;
4511 cmd->dw0.stream_in_type = 7 ;
4512 cmd->dw0.slice_type = slice_type_kernel[generic_state->frame_type] ;
4513 cmd->dw0.brc_mode_enable = generic_state->brc_enabled ;
4514 cmd->dw0.vdenc_mode_disable = 1 ;
4516 cmd->dw1.hme_stream_in_ref_cost = 5 ;
4517 cmd->dw1.num_of_refs = slice_param->num_ref_idx_l0_active_minus1 ;
4518 cmd->dw1.qp_value = avc_state->pic_param->pic_init_qp + slice_param->slice_qp_delta ;
4520 cmd->dw2.frame_width_in_mbs = generic_state->frame_width_in_mbs ;
4521 cmd->dw2.frame_height_in_mbs = generic_state->frame_height_in_mbs ;
4523 cmd->dw3.large_mv_threshold = 128 ;
4524 cmd->dw4.total_large_mv_threshold = (generic_state->frame_width_in_mbs * generic_state->frame_height_in_mbs)/100 ;
4525 cmd->dw5.zmv_threshold = 4 ;
4526 cmd->dw6.total_zmv_threshold = (generic_state->frame_width_in_mbs * generic_state->frame_height_in_mbs * avc_state->zero_mv_threshold)/100 ; // zero_mv_threshold = 60;
4527 cmd->dw7.min_dist_threshold = 10 ;
4529 if(generic_state->frame_type == SLICE_TYPE_P)
4531 memcpy(cmd->cost_table,gen9_avc_sfd_cost_table_p_frame,52* sizeof(unsigned char));
4533 }else if(generic_state->frame_type == SLICE_TYPE_B)
4535 memcpy(cmd->cost_table,gen9_avc_sfd_cost_table_b_frame,52* sizeof(unsigned char));
4538 cmd->dw21.actual_width_in_mb = cmd->dw2.frame_width_in_mbs ;
4539 cmd->dw21.actual_height_in_mb = cmd->dw2.frame_height_in_mbs ;
4540 cmd->dw24.vdenc_input_image_state_index = GEN9_AVC_SFD_VDENC_INPUT_IMAGE_STATE_INDEX ;
4541 cmd->dw26.mv_data_surface_index = GEN9_AVC_SFD_MV_DATA_SURFACE_INDEX ;
4542 cmd->dw27.inter_distortion_surface_index = GEN9_AVC_SFD_INTER_DISTORTION_SURFACE_INDEX ;
4543 cmd->dw28.output_data_surface_index = GEN9_AVC_SFD_OUTPUT_DATA_SURFACE_INDEX ;
4544 cmd->dw29.vdenc_output_image_state_index = GEN9_AVC_SFD_VDENC_OUTPUT_IMAGE_STATE_INDEX ;
4546 i965_gpe_context_unmap_curbe(gpe_context);
4551 gen9_avc_send_surface_sfd(VADriverContextP ctx,
4552 struct encode_state *encode_state,
4553 struct i965_gpe_context *gpe_context,
4554 struct intel_encoder_context *encoder_context,
4557 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4558 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
4559 struct i965_gpe_resource *gpe_resource;
4562 /*HME mv data surface memv output 4x*/
4563 gpe_resource = &avc_ctx->s4x_memv_data_buffer;
4564 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
4567 I965_SURFACEFORMAT_R8_UNORM,
4568 GEN9_AVC_SFD_MV_DATA_SURFACE_INDEX);
4570 /* memv distortion */
4571 gpe_resource = &avc_ctx->s4x_memv_distortion_buffer;
4572 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
4575 I965_SURFACEFORMAT_R8_UNORM,
4576 GEN9_AVC_SFD_INTER_DISTORTION_SURFACE_INDEX);
4579 gpe_resource = &avc_ctx->res_sfd_output_buffer;
4580 gen9_add_buffer_gpe_surface(ctx,
4586 GEN9_AVC_SFD_OUTPUT_DATA_SURFACE_INDEX);
4591 gen9_avc_kernel_sfd(VADriverContextP ctx,
4592 struct encode_state *encode_state,
4593 struct intel_encoder_context *encoder_context)
4595 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4596 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
4597 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
4599 struct i965_gpe_context *gpe_context;
4600 struct gpe_media_object_parameter media_object_param;
4601 struct gpe_media_object_inline_data media_object_inline_data;
4602 int media_function = INTEL_MEDIA_STATE_STATIC_FRAME_DETECTION;
4603 gpe_context = &(avc_ctx->context_sfd.gpe_contexts);
4605 gen8_gpe_context_init(ctx, gpe_context);
4606 gen9_gpe_reset_binding_table(ctx, gpe_context);
4609 generic_ctx->pfn_set_curbe_sfd(ctx,encode_state,gpe_context,encoder_context,NULL);
4612 generic_ctx->pfn_send_sfd_surface(ctx,encode_state,gpe_context,encoder_context,NULL);
4614 gen8_gpe_setup_interface_data(ctx, gpe_context);
4616 memset(&media_object_param, 0, sizeof(media_object_param));
4617 memset(&media_object_inline_data, 0, sizeof(media_object_inline_data));
4618 media_object_param.pinline_data = &media_object_inline_data;
4619 media_object_param.inline_size = sizeof(media_object_inline_data);
4621 gen9_avc_run_kernel_media_object(ctx, encoder_context,
4624 &media_object_param);
4626 return VA_STATUS_SUCCESS;
4630 kernel related function:init/destroy etc
4633 gen9_avc_kernel_init_scaling(VADriverContextP ctx,
4634 struct generic_encoder_context *generic_context,
4635 struct gen_avc_scaling_context *kernel_context)
4637 struct i965_gpe_context *gpe_context = NULL;
4638 struct encoder_kernel_parameter kernel_param ;
4639 struct encoder_scoreboard_parameter scoreboard_param;
4640 struct i965_kernel common_kernel;
4642 /* 4x scaling kernel*/
4643 kernel_param.curbe_size = sizeof(gen9_avc_scaling4x_curbe_data);
4644 kernel_param.inline_data_size = sizeof(gen9_avc_scaling4x_curbe_data);
4645 kernel_param.sampler_size = 0;
4647 memset(&scoreboard_param, 0, sizeof(scoreboard_param));
4648 scoreboard_param.mask = 0xFF;
4649 scoreboard_param.enable = generic_context->use_hw_scoreboard;
4650 scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
4651 scoreboard_param.walkpat_flag = 0;
4653 gpe_context = &kernel_context->gpe_contexts[GEN9_AVC_KERNEL_SCALING_4X_IDX];
4654 gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
4655 gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
4657 memset(&common_kernel, 0, sizeof(common_kernel));
4659 intel_avc_get_kernel_header_and_size((void *)(generic_context->enc_kernel_ptr),
4660 generic_context->enc_kernel_size,
4661 INTEL_GENERIC_ENC_SCALING4X,
4665 gen8_gpe_load_kernels(ctx,
4670 /*2x scaling kernel*/
4671 kernel_param.curbe_size = sizeof(gen9_avc_scaling2x_curbe_data);
4672 kernel_param.inline_data_size = 0;
4673 kernel_param.sampler_size = 0;
4675 gpe_context = &kernel_context->gpe_contexts[GEN9_AVC_KERNEL_SCALING_2X_IDX];
4676 gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
4677 gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
4679 memset(&common_kernel, 0, sizeof(common_kernel));
4681 intel_avc_get_kernel_header_and_size((void *)(generic_context->enc_kernel_ptr),
4682 generic_context->enc_kernel_size,
4683 INTEL_GENERIC_ENC_SCALING2X,
4687 gen8_gpe_load_kernels(ctx,
4695 gen9_avc_kernel_init_me(VADriverContextP ctx,
4696 struct generic_encoder_context *generic_context,
4697 struct gen_avc_me_context *kernel_context)
4699 struct i965_gpe_context *gpe_context = NULL;
4700 struct encoder_kernel_parameter kernel_param ;
4701 struct encoder_scoreboard_parameter scoreboard_param;
4702 struct i965_kernel common_kernel;
4705 kernel_param.curbe_size = sizeof(gen9_avc_me_curbe_data);
4706 kernel_param.inline_data_size = 0;
4707 kernel_param.sampler_size = 0;
4709 memset(&scoreboard_param, 0, sizeof(scoreboard_param));
4710 scoreboard_param.mask = 0xFF;
4711 scoreboard_param.enable = generic_context->use_hw_scoreboard;
4712 scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
4713 scoreboard_param.walkpat_flag = 0;
4715 for (i = 0; i < 2; i++) {
4716 gpe_context = &kernel_context->gpe_contexts[i];
4717 gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
4718 gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
4720 memset(&common_kernel, 0, sizeof(common_kernel));
4722 intel_avc_get_kernel_header_and_size((void *)(generic_context->enc_kernel_ptr),
4723 generic_context->enc_kernel_size,
4724 INTEL_GENERIC_ENC_ME,
4728 gen8_gpe_load_kernels(ctx,
4737 gen9_avc_kernel_init_mbenc(VADriverContextP ctx,
4738 struct generic_encoder_context *generic_context,
4739 struct gen_avc_mbenc_context *kernel_context)
4741 struct i965_gpe_context *gpe_context = NULL;
4742 struct encoder_kernel_parameter kernel_param ;
4743 struct encoder_scoreboard_parameter scoreboard_param;
4744 struct i965_kernel common_kernel;
4747 kernel_param.curbe_size = sizeof(gen9_avc_mbenc_curbe_data);
4748 kernel_param.inline_data_size = 0;
4749 kernel_param.sampler_size = 0;
4751 memset(&scoreboard_param, 0, sizeof(scoreboard_param));
4752 scoreboard_param.mask = 0xFF;
4753 scoreboard_param.enable = generic_context->use_hw_scoreboard;
4754 scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
4755 scoreboard_param.walkpat_flag = 0;
4757 for (i = 0; i < NUM_GEN9_AVC_KERNEL_MBENC ; i++) {
4758 gpe_context = &kernel_context->gpe_contexts[i];
4759 gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
4760 gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
4762 memset(&common_kernel, 0, sizeof(common_kernel));
4764 intel_avc_get_kernel_header_and_size((void *)(generic_context->enc_kernel_ptr),
4765 generic_context->enc_kernel_size,
4766 INTEL_GENERIC_ENC_MBENC,
4770 gen8_gpe_load_kernels(ctx,
4779 gen9_avc_kernel_init_brc(VADriverContextP ctx,
4780 struct generic_encoder_context *generic_context,
4781 struct gen_avc_brc_context *kernel_context)
4783 struct i965_gpe_context *gpe_context = NULL;
4784 struct encoder_kernel_parameter kernel_param ;
4785 struct encoder_scoreboard_parameter scoreboard_param;
4786 struct i965_kernel common_kernel;
4789 static const int brc_curbe_size[NUM_GEN9_AVC_KERNEL_BRC] = {
4790 (sizeof(gen9_avc_brc_init_reset_curbe_data)),
4791 (sizeof(gen9_avc_frame_brc_update_curbe_data)),
4792 (sizeof(gen9_avc_brc_init_reset_curbe_data)),
4793 (sizeof(gen9_avc_mbenc_curbe_data)),
4795 (sizeof(gen9_avc_mb_brc_curbe_data))
4798 kernel_param.inline_data_size = 0;
4799 kernel_param.sampler_size = 0;
4801 memset(&scoreboard_param, 0, sizeof(scoreboard_param));
4802 scoreboard_param.mask = 0xFF;
4803 scoreboard_param.enable = generic_context->use_hw_scoreboard;
4804 scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
4805 scoreboard_param.walkpat_flag = 0;
4807 for (i = 0; i < NUM_GEN9_AVC_KERNEL_BRC; i++) {
4808 kernel_param.curbe_size = brc_curbe_size[i];
4809 gpe_context = &kernel_context->gpe_contexts[i];
4810 gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
4811 gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
4813 memset(&common_kernel, 0, sizeof(common_kernel));
4815 intel_avc_get_kernel_header_and_size((void *)(generic_context->enc_kernel_ptr),
4816 generic_context->enc_kernel_size,
4817 INTEL_GENERIC_ENC_BRC,
4821 gen8_gpe_load_kernels(ctx,
4830 gen9_avc_kernel_init_wp(VADriverContextP ctx,
4831 struct generic_encoder_context *generic_context,
4832 struct gen_avc_wp_context *kernel_context)
4834 struct i965_gpe_context *gpe_context = NULL;
4835 struct encoder_kernel_parameter kernel_param ;
4836 struct encoder_scoreboard_parameter scoreboard_param;
4837 struct i965_kernel common_kernel;
4839 kernel_param.curbe_size = sizeof(gen9_avc_wp_curbe_data);
4840 kernel_param.inline_data_size = 0;
4841 kernel_param.sampler_size = 0;
4843 memset(&scoreboard_param, 0, sizeof(scoreboard_param));
4844 scoreboard_param.mask = 0xFF;
4845 scoreboard_param.enable = generic_context->use_hw_scoreboard;
4846 scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
4847 scoreboard_param.walkpat_flag = 0;
4849 gpe_context = &kernel_context->gpe_contexts;
4850 gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
4851 gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
4853 memset(&common_kernel, 0, sizeof(common_kernel));
4855 intel_avc_get_kernel_header_and_size((void *)(generic_context->enc_kernel_ptr),
4856 generic_context->enc_kernel_size,
4857 INTEL_GENERIC_ENC_WP,
4861 gen8_gpe_load_kernels(ctx,
4869 gen9_avc_kernel_init_sfd(VADriverContextP ctx,
4870 struct generic_encoder_context *generic_context,
4871 struct gen_avc_sfd_context *kernel_context)
4873 struct i965_gpe_context *gpe_context = NULL;
4874 struct encoder_kernel_parameter kernel_param ;
4875 struct encoder_scoreboard_parameter scoreboard_param;
4876 struct i965_kernel common_kernel;
4878 kernel_param.curbe_size = sizeof(gen9_avc_sfd_curbe_data);
4879 kernel_param.inline_data_size = 0;
4880 kernel_param.sampler_size = 0;
4882 memset(&scoreboard_param, 0, sizeof(scoreboard_param));
4883 scoreboard_param.mask = 0xFF;
4884 scoreboard_param.enable = generic_context->use_hw_scoreboard;
4885 scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
4886 scoreboard_param.walkpat_flag = 0;
4888 gpe_context = &kernel_context->gpe_contexts;
4889 gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
4890 gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
4892 memset(&common_kernel, 0, sizeof(common_kernel));
4894 intel_avc_get_kernel_header_and_size((void *)(generic_context->enc_kernel_ptr),
4895 generic_context->enc_kernel_size,
4896 INTEL_GENERIC_ENC_SFD,
4900 gen8_gpe_load_kernels(ctx,
4908 gen9_avc_kernel_destroy(struct encoder_vme_mfc_context * vme_context)
4911 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
4915 gen9_avc_free_resources(vme_context);
4917 for(i = 0; i < NUM_GEN9_AVC_KERNEL_SCALING; i++)
4918 gen8_gpe_context_destroy(&avc_ctx->context_scaling.gpe_contexts[i]);
4920 for(i = 0; i < NUM_GEN9_AVC_KERNEL_BRC; i++)
4921 gen8_gpe_context_destroy(&avc_ctx->context_brc.gpe_contexts[i]);
4923 for(i = 0; i < NUM_GEN9_AVC_KERNEL_ME; i++)
4924 gen8_gpe_context_destroy(&avc_ctx->context_me.gpe_contexts[i]);
4926 for(i = 0; i < NUM_GEN9_AVC_KERNEL_MBENC; i++)
4927 gen8_gpe_context_destroy(&avc_ctx->context_mbenc.gpe_contexts[i]);
4929 gen8_gpe_context_destroy(&avc_ctx->context_wp.gpe_contexts);
4931 gen8_gpe_context_destroy(&avc_ctx->context_sfd.gpe_contexts);
4939 gen9_avc_update_parameters(VADriverContextP ctx,
4941 struct encode_state *encode_state,
4942 struct intel_encoder_context *encoder_context)
4944 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4945 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
4946 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
4947 VAEncSequenceParameterBufferH264 *seq_param;
4948 VAEncPictureParameterBufferH264 *pic_param ;
4949 VAEncSliceParameterBufferH264 * slice_param;
4951 unsigned int preset = generic_state->preset;
4953 /* seq/pic/slice parameter setting */
4954 generic_state->b16xme_supported = gen9_avc_super_hme[preset];
4955 generic_state->b32xme_supported = gen9_avc_ultra_hme[preset];
4957 avc_state->seq_param = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
4958 avc_state->pic_param = (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext->buffer;
4961 avc_state->enable_avc_ildb = 0;
4962 avc_state->slice_num = 0;
4963 for (j = 0; j < encode_state->num_slice_params_ext && avc_state->enable_avc_ildb == 0; j++) {
4964 assert(encode_state->slice_params_ext && encode_state->slice_params_ext[j]->buffer);
4965 slice_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[j]->buffer;
4967 for (i = 0; i < encode_state->slice_params_ext[j]->num_elements; i++) {
4968 assert((slice_param->slice_type == SLICE_TYPE_I) ||
4969 (slice_param->slice_type == SLICE_TYPE_SI) ||
4970 (slice_param->slice_type == SLICE_TYPE_P) ||
4971 (slice_param->slice_type == SLICE_TYPE_SP) ||
4972 (slice_param->slice_type == SLICE_TYPE_B));
4974 if (slice_param->disable_deblocking_filter_idc != 1) {
4975 avc_state->enable_avc_ildb = 1;
4978 avc_state->slice_param[i] = slice_param;
4980 avc_state->slice_num++;
4984 /* how many slices support by now? 1 slice or multi slices, but row slice.not slice group. */
4985 seq_param = avc_state->seq_param;
4986 pic_param = avc_state->pic_param;
4987 slice_param = avc_state->slice_param[0];
4989 generic_state->frame_type = avc_state->slice_param[0]->slice_type;
4991 if (slice_param->slice_type == SLICE_TYPE_I ||
4992 slice_param->slice_type == SLICE_TYPE_SI)
4993 generic_state->frame_type = SLICE_TYPE_I;
4994 else if(slice_param->slice_type == SLICE_TYPE_P)
4995 generic_state->frame_type = SLICE_TYPE_P;
4996 else if(slice_param->slice_type == SLICE_TYPE_B)
4997 generic_state->frame_type = SLICE_TYPE_B;
4998 if (profile == VAProfileH264High)
4999 avc_state->transform_8x8_mode_enable = !!pic_param->pic_fields.bits.transform_8x8_mode_flag;
5001 avc_state->transform_8x8_mode_enable = 0;
5004 if(generic_state->brc_enabled &&(!generic_state->brc_inited || generic_state->brc_need_reset ))
5006 generic_state->target_bit_rate = ALIGN(seq_param->bits_per_second, 1000) / 1000;
5007 generic_state->init_vbv_buffer_fullness_in_bit = seq_param->bits_per_second;
5008 generic_state->vbv_buffer_size_in_bit = (uint64_t)seq_param->bits_per_second << 1;
5009 generic_state->frames_per_100s = 3000; /* 30fps */
5012 generic_state->gop_size = seq_param->intra_period;
5013 generic_state->gop_ref_distance = seq_param->ip_period;
5015 if (generic_state->internal_rate_mode == VA_RC_CBR) {
5016 generic_state->max_bit_rate = generic_state->target_bit_rate;
5017 generic_state->min_bit_rate = generic_state->target_bit_rate;
5020 if(generic_state->frame_type == SLICE_TYPE_I || generic_state->first_frame)
5022 gen9_avc_update_misc_parameters(ctx, encode_state, encoder_context);
5025 generic_state->preset = encoder_context->quality_level;
5026 if(encoder_context->quality_level == INTEL_PRESET_UNKNOWN)
5028 generic_state->preset = INTEL_PRESET_RT_SPEED;
5030 generic_state->kernel_mode = gen9_avc_kernel_mode[generic_state->preset];
5032 if(!generic_state->brc_inited)
5034 generic_state->brc_init_reset_input_bits_per_frame = ((double)(generic_state->max_bit_rate * 1000) * 100) / generic_state->frames_per_100s;;
5035 generic_state->brc_init_current_target_buf_full_in_bits = generic_state->init_vbv_buffer_fullness_in_bit;
5036 generic_state->brc_init_reset_buf_size_in_bits = generic_state->vbv_buffer_size_in_bit;
5037 generic_state->brc_target_size = generic_state->init_vbv_buffer_fullness_in_bit;
5041 generic_state->curr_pak_pass = 0;
5042 generic_state->num_pak_passes = MAX_AVC_PAK_PASS_NUM;
5044 if (generic_state->internal_rate_mode == VA_RC_CBR ||
5045 generic_state->internal_rate_mode == VA_RC_VBR)
5046 generic_state->brc_enabled = 1;
5048 generic_state->brc_enabled = 0;
5050 if (generic_state->brc_enabled &&
5051 (!generic_state->init_vbv_buffer_fullness_in_bit ||
5052 !generic_state->vbv_buffer_size_in_bit ||
5053 !generic_state->max_bit_rate ||
5054 !generic_state->target_bit_rate ||
5055 !generic_state->frames_per_100s))
5057 WARN_ONCE("Rate control parameter is required for BRC\n");
5058 generic_state->brc_enabled = 0;
5061 if (!generic_state->brc_enabled) {
5062 generic_state->target_bit_rate = 0;
5063 generic_state->max_bit_rate = 0;
5064 generic_state->min_bit_rate = 0;
5065 generic_state->init_vbv_buffer_fullness_in_bit = 0;
5066 generic_state->vbv_buffer_size_in_bit = 0;
5067 generic_state->num_pak_passes = 1;
5069 generic_state->num_pak_passes = MAX_AVC_PAK_PASS_NUM;
5073 generic_state->frame_width_in_mbs = seq_param->picture_width_in_mbs;
5074 generic_state->frame_height_in_mbs = seq_param->picture_height_in_mbs;
5075 generic_state->frame_width_in_pixel = generic_state->frame_width_in_mbs * 16;
5076 generic_state->frame_height_in_pixel = generic_state->frame_height_in_mbs * 16;
5078 generic_state->frame_width_4x = ALIGN(generic_state->frame_width_in_pixel/4,16);
5079 generic_state->frame_height_4x = ALIGN(generic_state->frame_height_in_pixel/4,16);
5080 generic_state->downscaled_width_4x_in_mb = generic_state->frame_width_4x/16 ;
5081 generic_state->downscaled_height_4x_in_mb = generic_state->frame_height_4x/16;
5083 generic_state->frame_width_16x = ALIGN(generic_state->frame_width_in_pixel/16,16);
5084 generic_state->frame_height_16x = ALIGN(generic_state->frame_height_in_pixel/16,16);
5085 generic_state->downscaled_width_16x_in_mb = generic_state->frame_width_16x/16 ;
5086 generic_state->downscaled_height_16x_in_mb = generic_state->frame_height_16x/16;
5088 generic_state->frame_width_32x = ALIGN(generic_state->frame_width_in_pixel/32,16);
5089 generic_state->frame_height_32x = ALIGN(generic_state->frame_height_in_pixel/32,16);
5090 generic_state->downscaled_width_32x_in_mb = generic_state->frame_width_32x/16 ;
5091 generic_state->downscaled_height_32x_in_mb = generic_state->frame_height_32x/16;
5093 if (generic_state->hme_supported) {
5094 generic_state->hme_enabled = 1;
5096 generic_state->hme_enabled = 0;
5099 if (generic_state->b16xme_supported) {
5100 generic_state->b16xme_enabled = 1;
5102 generic_state->b16xme_enabled = 0;
5105 if (generic_state->b32xme_supported) {
5106 generic_state->b32xme_enabled = 1;
5108 generic_state->b32xme_enabled = 0;
5110 /* disable HME/16xME if the size is too small */
5111 if (generic_state->frame_width_4x <= INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT) {
5112 generic_state->b32xme_supported = 0;
5113 generic_state->b32xme_enabled = 0;
5114 generic_state->b16xme_supported = 0;
5115 generic_state->b16xme_enabled = 0;
5116 generic_state->frame_width_4x = INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT;
5117 generic_state->downscaled_width_4x_in_mb = WIDTH_IN_MACROBLOCKS(INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT);
5119 if (generic_state->frame_height_4x <= INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT) {
5120 generic_state->b32xme_supported = 0;
5121 generic_state->b32xme_enabled = 0;
5122 generic_state->b16xme_supported = 0;
5123 generic_state->b16xme_enabled = 0;
5124 generic_state->frame_height_4x = INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT;
5125 generic_state->downscaled_height_4x_in_mb = WIDTH_IN_MACROBLOCKS(INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT);
5128 if (generic_state->frame_width_16x < INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT)
5130 generic_state->b32xme_supported = 0;
5131 generic_state->b32xme_enabled = 0;
5132 generic_state->frame_width_16x = INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT;
5133 generic_state->downscaled_width_16x_in_mb = WIDTH_IN_MACROBLOCKS(INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT);
5135 if (generic_state->frame_height_16x < INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT) {
5136 generic_state->b32xme_supported = 0;
5137 generic_state->b32xme_enabled = 0;
5138 generic_state->frame_height_16x = INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT;
5139 generic_state->downscaled_height_16x_in_mb = WIDTH_IN_MACROBLOCKS(INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT);
5142 if (generic_state->frame_width_32x < INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT)
5144 generic_state->frame_width_32x = INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT;
5145 generic_state->downscaled_width_32x_in_mb = WIDTH_IN_MACROBLOCKS(INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT);
5147 if (generic_state->frame_height_32x < INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT) {
5148 generic_state->frame_height_32x = INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT;
5149 generic_state->downscaled_height_32x_in_mb = WIDTH_IN_MACROBLOCKS(INTEL_VME_MIN_ALLOWED_WIDTH_HEIGHT);
5155 gen9_avc_encode_check_parameter(VADriverContextP ctx,
5156 struct encode_state *encode_state,
5157 struct intel_encoder_context *encoder_context)
5159 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5160 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
5161 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
5162 unsigned int rate_control_mode = encoder_context->rate_control_mode;
5163 unsigned int preset = generic_state->preset;
5164 VAEncPictureParameterBufferH264 *pic_param ;
5167 /*resolution change detection*/
5168 pic_param = avc_state->pic_param;
5171 generic_state->avbr_curracy = 30;
5172 generic_state->avbr_convergence = 150;
5174 switch (rate_control_mode & 0x7f) {
5176 generic_state->internal_rate_mode = VA_RC_CBR;
5180 generic_state->internal_rate_mode = VA_RC_VBR;
5185 generic_state->internal_rate_mode = VA_RC_CQP;
5189 if (rate_control_mode != VA_RC_NONE &&
5190 rate_control_mode != VA_RC_CQP) {
5191 generic_state->brc_enabled = 1;
5192 generic_state->brc_distortion_buffer_supported = 1;
5193 generic_state->brc_constant_buffer_supported = 1;
5194 generic_state->num_pak_passes = MAX_AVC_PAK_PASS_NUM;
5197 /*check brc parameter*/
5198 if(generic_state->brc_enabled)
5200 avc_state->mb_qp_data_enable = 0;
5203 /*set the brc init and reset accordingly*/
5204 if(generic_state->brc_need_reset &&
5205 (generic_state->brc_distortion_buffer_supported == 0 ||
5206 rate_control_mode == VA_RC_CQP))
5208 generic_state->brc_need_reset = 0;// not support by CQP
5211 if(generic_state->brc_need_reset && !avc_state->sfd_mb_enable)
5213 avc_state->sfd_enable = 0;
5216 if(generic_state->frames_per_window_size == 0)
5218 generic_state->frames_per_window_size = (generic_state->frames_per_100s/100 < 60)?(generic_state->frames_per_100s/100):60;
5219 }else if(generic_state->frames_per_window_size > 2 * generic_state->frames_per_100s/100)
5221 generic_state->frames_per_window_size = (generic_state->frames_per_100s/100 < 60)?(generic_state->frames_per_100s/100):60;
5224 if(generic_state->brc_enabled)
5226 generic_state->hme_enabled = generic_state->frame_type != SLICE_TYPE_I;
5227 if(avc_state->min_max_qp_enable)
5229 generic_state->num_pak_passes = 1;
5231 generic_state->brc_roi_enable = (rate_control_mode != VA_RC_CQP) && (generic_state->num_roi > 0);// only !CQP
5232 generic_state->mb_brc_enabled = generic_state->mb_brc_enabled || generic_state->brc_roi_enable;
5235 generic_state->num_pak_passes = 1;// CQP only one pass
5238 avc_state->mbenc_i_frame_dist_in_use = 0;
5239 avc_state->mbenc_i_frame_dist_in_use = (generic_state->brc_enabled) && (generic_state->brc_distortion_buffer_supported) && (generic_state->frame_type == SLICE_TYPE_I);
5241 /*ROI must enable mbbrc.*/
5244 if(avc_state->caf_supported)
5246 switch(generic_state->frame_type)
5251 avc_state->caf_enable = gen9_avc_all_fractional[preset] & 0x01;
5254 avc_state->caf_enable = (gen9_avc_all_fractional[preset] >> 1) & 0x01;
5258 if(avc_state->caf_enable && avc_state->caf_disable_hd && gen9_avc_disable_all_fractional_check_for_high_res[preset])
5260 if(generic_state->frame_width_in_pixel >= 1280 && generic_state->frame_height_in_pixel >= 720)
5261 avc_state->caf_enable = 0;
5265 avc_state->adaptive_transform_decision_enable &= gen9_avc_enable_adaptive_tx_decision[preset&0x7];
5267 /* Flatness check is enabled only if scaling will be performed and CAF is enabled. here only frame */
5268 if(avc_state->flatness_check_supported )
5270 avc_state->flatness_check_enable = ((avc_state->caf_enable) && (generic_state->brc_enabled || generic_state->hme_supported)) ;
5273 avc_state->flatness_check_enable = 0;
5276 /* check mb_status_supported/enbale*/
5277 if(avc_state->adaptive_transform_decision_enable)
5279 avc_state->mb_status_enable = 1;
5282 avc_state->mb_status_enable = 0;
5284 /*slice check,all the slices use the same slice height except the last slice*/
5285 avc_state->arbitrary_num_mbs_in_slice = 0;
5286 for(i = 0; i < avc_state->slice_num;i++)
5288 assert(avc_state->slice_param[i]->num_macroblocks % generic_state->frame_width_in_mbs == 0);
5289 avc_state->slice_height = avc_state->slice_param[i]->num_macroblocks / generic_state->frame_width_in_mbs;
5290 /*add it later for muli slices map*/
5293 if(generic_state->frame_type == SLICE_TYPE_I)
5295 generic_state->hme_enabled = 0;
5296 generic_state->b16xme_enabled = 0;
5297 generic_state->b32xme_enabled = 0;
5300 if(generic_state->frame_type == SLICE_TYPE_B)
5302 gen9_avc_get_dist_scale_factor(ctx,encode_state,encoder_context);
5303 avc_state->bi_weight = gen9_avc_get_biweight(avc_state->dist_scale_factor_list0[0],pic_param->pic_fields.bits.weighted_bipred_idc);
5306 /* Determine if SkipBiasAdjustment should be enabled for P picture 1. No B frame 2. Qp >= 22 3. CQP mode */
5307 avc_state->skip_bias_adjustment_enable = avc_state->skip_bias_adjustment_supported && (generic_state->frame_type == SLICE_TYPE_P)
5308 && (generic_state->gop_ref_distance == 1) && (avc_state->pic_param->pic_init_qp + avc_state->slice_param[0]->slice_qp_delta >= 22) && !generic_state->brc_enabled;
5310 if(generic_state->kernel_mode == INTEL_ENC_KERNEL_QUALITY)
5312 avc_state->tq_enable = 1;
5313 avc_state->tq_rounding = 6;
5314 if(generic_state->brc_enabled)
5316 generic_state->mb_brc_enabled = 1;
5320 return VA_STATUS_SUCCESS;
5324 gen9_avc_vme_gpe_kernel_prepare(VADriverContextP ctx,
5325 struct encode_state *encode_state,
5326 struct intel_encoder_context *encoder_context)
5329 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5330 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
5331 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
5332 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
5333 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
5335 struct object_surface *obj_surface;
5336 struct object_buffer *obj_buffer;
5337 VAEncSliceParameterBufferH264 * slice_param = avc_state->slice_param[0];
5338 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
5339 struct i965_coded_buffer_segment *coded_buffer_segment;
5341 struct gen9_surface_avc *avc_priv_surface;
5343 struct avc_surface_param surface_param;
5345 unsigned char * pdata;
5347 /* Setup current reconstruct frame */
5348 obj_surface = encode_state->reconstructed_object;
5349 va_status = i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC_NV12, SUBSAMPLE_YUV420);
5351 if (va_status != VA_STATUS_SUCCESS)
5354 memset(&surface_param,0,sizeof(surface_param));
5355 surface_param.frame_width = generic_state->frame_width_in_pixel;
5356 surface_param.frame_height = generic_state->frame_height_in_pixel;
5357 va_status = gen9_avc_init_check_surfaces(ctx,
5361 if (va_status != VA_STATUS_SUCCESS)
5364 /* init the member of avc_priv_surface,frame_store_id,qp_value*/
5365 avc_priv_surface = (struct gen9_surface_avc *)obj_surface->private_data;
5366 avc_state->top_field_poc[NUM_MFC_AVC_DMV_BUFFERS-2] = 0;
5367 avc_state->top_field_poc[NUM_MFC_AVC_DMV_BUFFERS-1] = 0;
5368 i965_free_gpe_resource(&avc_ctx->res_direct_mv_buffersr[NUM_MFC_AVC_DMV_BUFFERS-2]);
5369 i965_free_gpe_resource(&avc_ctx->res_direct_mv_buffersr[NUM_MFC_AVC_DMV_BUFFERS-1]);
5370 i965_dri_object_to_buffer_gpe_resource(&avc_ctx->res_direct_mv_buffersr[NUM_MFC_AVC_DMV_BUFFERS-2],avc_priv_surface->dmv_top);
5371 i965_dri_object_to_buffer_gpe_resource(&avc_ctx->res_direct_mv_buffersr[NUM_MFC_AVC_DMV_BUFFERS-1],avc_priv_surface->dmv_bottom);
5372 avc_priv_surface->qp_value = pic_param->pic_init_qp + slice_param->slice_qp_delta;
5373 avc_priv_surface->frame_store_id = 0;
5374 avc_priv_surface->frame_idx = pic_param->CurrPic.frame_idx;
5375 avc_priv_surface->top_field_order_cnt = pic_param->CurrPic.TopFieldOrderCnt;
5376 avc_priv_surface->is_as_ref = pic_param->pic_fields.bits.reference_pic_flag;
5377 avc_state->top_field_poc[NUM_MFC_AVC_DMV_BUFFERS-2] = avc_priv_surface->top_field_order_cnt;
5378 avc_state->top_field_poc[NUM_MFC_AVC_DMV_BUFFERS-1] = avc_priv_surface->top_field_order_cnt + 1;
5380 i965_free_gpe_resource(&generic_ctx->res_reconstructed_surface);
5381 i965_object_surface_to_2d_gpe_resource_with_align(&generic_ctx->res_reconstructed_surface, obj_surface,GPE_RESOURCE_ALIGNMENT);
5383 /* input YUV surface*/
5384 obj_surface = encode_state->input_yuv_object;
5385 va_status = i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC_NV12, SUBSAMPLE_YUV420);
5387 if (va_status != VA_STATUS_SUCCESS)
5389 i965_free_gpe_resource(&generic_ctx->res_uncompressed_input_surface);
5390 i965_object_surface_to_2d_gpe_resource_with_align(&generic_ctx->res_uncompressed_input_surface, obj_surface,GPE_RESOURCE_ALIGNMENT);
5392 /* Reference surfaces */
5393 for (i = 0; i < ARRAY_ELEMS(avc_ctx->list_reference_res); i++) {
5394 i965_free_gpe_resource(&avc_ctx->list_reference_res[i]);
5395 i965_free_gpe_resource(&avc_ctx->res_direct_mv_buffersr[i*2]);
5396 i965_free_gpe_resource(&avc_ctx->res_direct_mv_buffersr[i*2 + 1]);
5397 obj_surface = encode_state->reference_objects[i];
5398 avc_state->top_field_poc[2*i] = 0;
5399 avc_state->top_field_poc[2*i+1] = 0;
5401 if (obj_surface && obj_surface->bo) {
5402 i965_object_surface_to_2d_gpe_resource_with_align(&avc_ctx->list_reference_res[i], obj_surface,GPE_RESOURCE_ALIGNMENT);
5404 /* actually it should be handled when it is reconstructed surface*/
5405 va_status = gen9_avc_init_check_surfaces(ctx,
5406 obj_surface,encoder_context,
5408 if (va_status != VA_STATUS_SUCCESS)
5410 avc_priv_surface = (struct gen9_surface_avc *)obj_surface->private_data;
5411 i965_dri_object_to_buffer_gpe_resource(&avc_ctx->res_direct_mv_buffersr[i*2],avc_priv_surface->dmv_top);
5412 i965_dri_object_to_buffer_gpe_resource(&avc_ctx->res_direct_mv_buffersr[i*2 + 1],avc_priv_surface->dmv_bottom);
5413 avc_state->top_field_poc[2*i] = avc_priv_surface->top_field_order_cnt;
5414 avc_state->top_field_poc[2*i+1] = avc_priv_surface->top_field_order_cnt + 1;
5415 avc_priv_surface->frame_store_id = i;
5422 /* Encoded bitstream ?*/
5423 obj_buffer = encode_state->coded_buf_object;
5424 bo = obj_buffer->buffer_store->bo;
5425 i965_free_gpe_resource(&generic_ctx->compressed_bitstream.res);
5426 i965_dri_object_to_buffer_gpe_resource(&generic_ctx->compressed_bitstream.res, bo);
5427 generic_ctx->compressed_bitstream.start_offset = I965_CODEDBUFFER_HEADER_SIZE;
5428 generic_ctx->compressed_bitstream.end_offset = ALIGN(obj_buffer->size_element - 0x1000, 0x1000);
5431 avc_ctx->status_buffer.bo = bo;
5433 /* set the internal flag to 0 to indicate the coded size is unknown */
5435 coded_buffer_segment = (struct i965_coded_buffer_segment *)bo->virtual;
5436 coded_buffer_segment->mapped = 0;
5437 coded_buffer_segment->codec = encoder_context->codec;
5438 coded_buffer_segment->status_support = 1;
5440 pdata = bo->virtual + avc_ctx->status_buffer.base_offset;
5441 memset(pdata,0,avc_ctx->status_buffer.status_buffer_size);
5444 //frame id, it is the ref pic id in the reference_objects list.
5445 avc_state->num_refs[0] = 0;
5446 avc_state->num_refs[1] = 0;
5447 if (generic_state->frame_type == SLICE_TYPE_P) {
5448 avc_state->num_refs[0] = pic_param->num_ref_idx_l0_active_minus1 + 1;
5450 if (slice_param->num_ref_idx_active_override_flag)
5451 avc_state->num_refs[0] = slice_param->num_ref_idx_l0_active_minus1 + 1;
5452 } else if (generic_state->frame_type == SLICE_TYPE_B) {
5453 avc_state->num_refs[0] = pic_param->num_ref_idx_l0_active_minus1 + 1;
5454 avc_state->num_refs[1] = pic_param->num_ref_idx_l1_active_minus1 + 1;
5456 if (slice_param->num_ref_idx_active_override_flag) {
5457 avc_state->num_refs[0] = slice_param->num_ref_idx_l0_active_minus1 + 1;
5458 avc_state->num_refs[1] = slice_param->num_ref_idx_l1_active_minus1 + 1;
5462 if (avc_state->num_refs[0] > ARRAY_ELEMS(avc_state->list_ref_idx[0]))
5463 return VA_STATUS_ERROR_INVALID_VALUE;
5464 if (avc_state->num_refs[1] > ARRAY_ELEMS(avc_state->list_ref_idx[1]))
5465 return VA_STATUS_ERROR_INVALID_VALUE;
5467 for (i = 0; i < ARRAY_ELEMS(avc_state->list_ref_idx[0]); i++) {
5468 VAPictureH264 *va_pic;
5470 assert(ARRAY_ELEMS(slice_param->RefPicList0) == ARRAY_ELEMS(avc_state->list_ref_idx[0]));
5471 avc_state->list_ref_idx[0][i] = 0;
5473 if (i >= avc_state->num_refs[0])
5476 va_pic = &slice_param->RefPicList0[i];
5478 for (j = 0; j < ARRAY_ELEMS(encode_state->reference_objects); j++) {
5479 obj_surface = encode_state->reference_objects[j];
5483 obj_surface->base.id == va_pic->picture_id) {
5485 assert(obj_surface->base.id != VA_INVALID_SURFACE);
5486 avc_state->list_ref_idx[0][i] = j;
5492 for (i = 0; i < ARRAY_ELEMS(avc_state->list_ref_idx[1]); i++) {
5493 VAPictureH264 *va_pic;
5495 assert(ARRAY_ELEMS(slice_param->RefPicList1) == ARRAY_ELEMS(avc_state->list_ref_idx[1]));
5496 avc_state->list_ref_idx[1][i] = 0;
5498 if (i >= avc_state->num_refs[1])
5501 va_pic = &slice_param->RefPicList1[i];
5503 for (j = 0; j < ARRAY_ELEMS(encode_state->reference_objects); j++) {
5504 obj_surface = encode_state->reference_objects[j];
5508 obj_surface->base.id == va_pic->picture_id) {
5510 assert(obj_surface->base.id != VA_INVALID_SURFACE);
5511 avc_state->list_ref_idx[1][i] = j;
5518 return VA_STATUS_SUCCESS;
5522 gen9_avc_vme_gpe_kernel_init(VADriverContextP ctx,
5523 struct encode_state *encode_state,
5524 struct intel_encoder_context *encoder_context)
5526 return VA_STATUS_SUCCESS;
5530 gen9_avc_vme_gpe_kernel_final(VADriverContextP ctx,
5531 struct encode_state *encode_state,
5532 struct intel_encoder_context *encoder_context)
5535 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5536 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
5537 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
5539 /*set this flag when all kernel is finished*/
5540 if(generic_state->brc_enabled)
5542 generic_state->brc_inited = 1;
5543 generic_state->brc_need_reset = 0;
5544 avc_state->mbenc_curbe_set_in_brc_update = 0;
5546 return VA_STATUS_SUCCESS;
5550 gen9_avc_vme_gpe_kernel_run(VADriverContextP ctx,
5551 struct encode_state *encode_state,
5552 struct intel_encoder_context *encoder_context)
5554 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5555 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
5556 struct avc_enc_state * avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
5558 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
5559 VAEncSliceParameterBufferH264 *slice_param = avc_state->slice_param[0];
5562 /* BRC init/reset needs to be called before HME since it will reset the Brc Distortion surface*/
5563 if(generic_state->brc_enabled &&(!generic_state->brc_inited || generic_state->brc_need_reset ))
5565 gen9_avc_kernel_brc_init_reset(ctx,encode_state,encoder_context);
5569 if(generic_state->hme_supported)
5571 gen9_avc_kernel_scaling(ctx,encode_state,encoder_context,INTEL_ENC_HME_4x);
5572 if(generic_state->b16xme_supported)
5574 gen9_avc_kernel_scaling(ctx,encode_state,encoder_context,INTEL_ENC_HME_16x);
5575 if(generic_state->b32xme_supported)
5577 gen9_avc_kernel_scaling(ctx,encode_state,encoder_context,INTEL_ENC_HME_32x);
5583 if(generic_state->hme_enabled)
5585 if(generic_state->b16xme_enabled)
5587 if(generic_state->b32xme_enabled)
5589 gen9_avc_kernel_me(ctx,encode_state,encoder_context,INTEL_ENC_HME_32x);
5591 gen9_avc_kernel_me(ctx,encode_state,encoder_context,INTEL_ENC_HME_16x);
5593 gen9_avc_kernel_me(ctx,encode_state,encoder_context,INTEL_ENC_HME_4x);
5596 /*call SFD kernel after HME in same command buffer*/
5597 sfd_in_use = avc_state->sfd_enable && generic_state->hme_enabled;
5598 sfd_in_use = sfd_in_use && !avc_state->sfd_mb_enable;
5601 gen9_avc_kernel_sfd(ctx,encode_state,encoder_context);
5604 /* BRC and MbEnc are included in the same task phase*/
5605 if(generic_state->brc_enabled)
5607 if(avc_state->mbenc_i_frame_dist_in_use)
5609 gen9_avc_kernel_mbenc(ctx,encode_state,encoder_context,true);
5611 gen9_avc_kernel_brc_frame_update(ctx,encode_state,encoder_context);
5613 if(generic_state->mb_brc_enabled)
5615 gen9_avc_kernel_brc_mb_update(ctx,encode_state,encoder_context);
5619 /*weight prediction,disable by now */
5620 avc_state->weighted_ref_l0_enable = 0;
5621 avc_state->weighted_ref_l1_enable = 0;
5622 if(avc_state->weighted_prediction_supported &&
5623 ((generic_state->frame_type == SLICE_TYPE_P && pic_param->pic_fields.bits.weighted_pred_flag) ||
5624 (generic_state->frame_type == SLICE_TYPE_B && pic_param->pic_fields.bits.weighted_bipred_idc == INTEL_AVC_WP_MODE_EXPLICIT)))
5626 if(slice_param->luma_weight_l0_flag & 1)
5628 gen9_avc_kernel_wp(ctx,encode_state,encoder_context,0);
5630 }else if(!(slice_param->chroma_weight_l0_flag & 1))
5632 pic_param->pic_fields.bits.weighted_pred_flag = 0;// it should be handled in app
5635 if(generic_state->frame_type == SLICE_TYPE_B && pic_param->pic_fields.bits.weighted_bipred_idc == INTEL_AVC_WP_MODE_EXPLICIT)
5637 if(slice_param->luma_weight_l1_flag & 1)
5639 gen9_avc_kernel_wp(ctx,encode_state,encoder_context,1);
5640 }else if(!((slice_param->luma_weight_l0_flag & 1)||
5641 (slice_param->chroma_weight_l0_flag & 1)||
5642 (slice_param->chroma_weight_l1_flag & 1)))
5644 pic_param->pic_fields.bits.weighted_bipred_idc = INTEL_AVC_WP_MODE_DEFAULT;// it should be handled in app
5650 gen9_avc_kernel_mbenc(ctx,encode_state,encoder_context,false);
5652 /*ignore the reset vertical line kernel*/
5654 return VA_STATUS_SUCCESS;
5658 gen9_avc_vme_pipeline(VADriverContextP ctx,
5660 struct encode_state *encode_state,
5661 struct intel_encoder_context *encoder_context)
5665 gen9_avc_update_parameters(ctx, profile, encode_state, encoder_context);
5667 va_status = gen9_avc_encode_check_parameter(ctx, encode_state, encoder_context);
5668 if (va_status != VA_STATUS_SUCCESS)
5671 va_status = gen9_avc_allocate_resources(ctx, encode_state, encoder_context);
5672 if (va_status != VA_STATUS_SUCCESS)
5675 va_status = gen9_avc_vme_gpe_kernel_prepare(ctx, encode_state, encoder_context);
5676 if (va_status != VA_STATUS_SUCCESS)
5679 va_status = gen9_avc_vme_gpe_kernel_init(ctx, encode_state, encoder_context);
5680 if (va_status != VA_STATUS_SUCCESS)
5683 va_status = gen9_avc_vme_gpe_kernel_run(ctx, encode_state, encoder_context);
5684 if (va_status != VA_STATUS_SUCCESS)
5687 gen9_avc_vme_gpe_kernel_final(ctx, encode_state, encoder_context);
5689 return VA_STATUS_SUCCESS;
5693 gen9_avc_vme_context_destroy(void * context)
5695 struct encoder_vme_mfc_context *vme_context = (struct encoder_vme_mfc_context *)context;
5696 struct generic_encoder_context *generic_ctx;
5697 struct i965_avc_encoder_context *avc_ctx;
5698 struct generic_enc_codec_state *generic_state;
5699 struct avc_enc_state *avc_state;
5704 generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
5705 avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
5706 generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
5707 avc_state = (struct avc_enc_state * )vme_context->private_enc_state;
5709 gen9_avc_kernel_destroy(vme_context);
5713 free(generic_state);
5721 gen9_avc_kernel_init(VADriverContextP ctx,
5722 struct intel_encoder_context *encoder_context)
5724 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5725 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
5726 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )vme_context->generic_enc_ctx;
5728 gen9_avc_kernel_init_scaling(ctx,generic_ctx,&avc_ctx->context_scaling);
5729 gen9_avc_kernel_init_brc(ctx,generic_ctx,&avc_ctx->context_brc);
5730 gen9_avc_kernel_init_me(ctx,generic_ctx,&avc_ctx->context_me);
5731 gen9_avc_kernel_init_mbenc(ctx,generic_ctx,&avc_ctx->context_mbenc);
5732 gen9_avc_kernel_init_wp(ctx,generic_ctx,&avc_ctx->context_wp);
5733 gen9_avc_kernel_init_sfd(ctx,generic_ctx,&avc_ctx->context_sfd);
5736 generic_ctx->pfn_set_curbe_scaling2x = gen9_avc_set_curbe_scaling2x;
5737 generic_ctx->pfn_set_curbe_scaling4x = gen9_avc_set_curbe_scaling4x;
5738 generic_ctx->pfn_set_curbe_me = gen9_avc_set_curbe_me;
5739 generic_ctx->pfn_set_curbe_mbenc = gen9_avc_set_curbe_mbenc;
5740 generic_ctx->pfn_set_curbe_brc_init_reset = gen9_avc_set_curbe_brc_init_reset;
5741 generic_ctx->pfn_set_curbe_brc_frame_update = gen9_avc_set_curbe_brc_frame_update;
5742 generic_ctx->pfn_set_curbe_brc_mb_update = gen9_avc_set_curbe_brc_mb_update;
5743 generic_ctx->pfn_set_curbe_sfd = gen9_avc_set_curbe_sfd;
5744 generic_ctx->pfn_set_curbe_wp = gen9_avc_set_curbe_wp;
5746 generic_ctx->pfn_send_scaling_surface = gen9_avc_send_surface_scaling;
5747 generic_ctx->pfn_send_me_surface = gen9_avc_send_surface_me;
5748 generic_ctx->pfn_send_mbenc_surface = gen9_avc_send_surface_mbenc;
5749 generic_ctx->pfn_send_brc_init_reset_surface = gen9_avc_send_surface_brc_init_reset;
5750 generic_ctx->pfn_send_brc_frame_update_surface = gen9_avc_send_surface_brc_frame_update;
5751 generic_ctx->pfn_send_brc_mb_update_surface = gen9_avc_send_surface_brc_mb_update;
5752 generic_ctx->pfn_send_sfd_surface = gen9_avc_send_surface_sfd;
5753 generic_ctx->pfn_send_wp_surface = gen9_avc_send_surface_wp;
5758 PAK pipeline related function
5761 intel_avc_enc_slice_type_fixup(int slice_type);
5764 gen9_mfc_avc_pipe_mode_select(VADriverContextP ctx,
5765 struct encode_state *encode_state,
5766 struct intel_encoder_context *encoder_context)
5768 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5769 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )pak_context->private_enc_ctx;
5770 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
5771 struct intel_batchbuffer *batch = encoder_context->base.batch;
5773 BEGIN_BCS_BATCH(batch, 5);
5775 OUT_BCS_BATCH(batch, MFX_PIPE_MODE_SELECT | (5 - 2));
5776 OUT_BCS_BATCH(batch,
5778 (MFX_LONG_MODE << 17) | /* Must be long format for encoder */
5779 (MFD_MODE_VLD << 15) |
5780 (0 << 13) | /* Non-VDEnc mode is 0*/
5781 ((generic_state->curr_pak_pass != (generic_state->num_pak_passes -1)) << 10) | /* Stream-Out Enable */
5782 ((!!avc_ctx->res_post_deblocking_output.bo) << 9) | /* Post Deblocking Output */
5783 ((!!avc_ctx->res_pre_deblocking_output.bo) << 8) | /* Pre Deblocking Output */
5784 (0 << 7) | /* Scaled surface enable */
5785 (0 << 6) | /* Frame statistics stream out enable */
5786 (0 << 5) | /* not in stitch mode */
5787 (1 << 4) | /* encoding mode */
5788 (MFX_FORMAT_AVC << 0));
5789 OUT_BCS_BATCH(batch,
5790 (0 << 7) | /* expand NOA bus flag */
5791 (0 << 6) | /* disable slice-level clock gating */
5792 (0 << 5) | /* disable clock gating for NOA */
5793 (0 << 4) | /* terminate if AVC motion and POC table error occurs */
5794 (0 << 3) | /* terminate if AVC mbdata error occurs */
5795 (0 << 2) | /* terminate if AVC CABAC/CAVLC decode error occurs */
5798 OUT_BCS_BATCH(batch, 0);
5799 OUT_BCS_BATCH(batch, 0);
5801 ADVANCE_BCS_BATCH(batch);
5805 gen9_mfc_avc_surface_state(VADriverContextP ctx,
5806 struct intel_encoder_context *encoder_context,
5807 struct i965_gpe_resource *gpe_resource,
5810 struct intel_batchbuffer *batch = encoder_context->base.batch;
5812 BEGIN_BCS_BATCH(batch, 6);
5814 OUT_BCS_BATCH(batch, MFX_SURFACE_STATE | (6 - 2));
5815 OUT_BCS_BATCH(batch, id);
5816 OUT_BCS_BATCH(batch,
5817 ((gpe_resource->height - 1) << 18) |
5818 ((gpe_resource->width - 1) << 4));
5819 OUT_BCS_BATCH(batch,
5820 (MFX_SURFACE_PLANAR_420_8 << 28) | /* 420 planar YUV surface */
5821 (1 << 27) | /* must be 1 for interleave U/V, hardware requirement */
5822 ((gpe_resource->pitch - 1) << 3) | /* pitch */
5823 (0 << 2) | /* must be 0 for interleave U/V */
5824 (1 << 1) | /* must be tiled */
5825 (I965_TILEWALK_YMAJOR << 0)); /* tile walk, TILEWALK_YMAJOR */
5826 OUT_BCS_BATCH(batch,
5827 (0 << 16) | /* must be 0 for interleave U/V */
5828 (gpe_resource->y_cb_offset)); /* y offset for U(cb) */
5829 OUT_BCS_BATCH(batch,
5830 (0 << 16) | /* must be 0 for interleave U/V */
5831 (gpe_resource->y_cb_offset)); /* y offset for U(cb) */
5833 ADVANCE_BCS_BATCH(batch);
5837 gen9_mfc_avc_pipe_buf_addr_state(VADriverContextP ctx, struct intel_encoder_context *encoder_context)
5839 struct i965_driver_data *i965 = i965_driver_data(ctx);
5840 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5841 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )pak_context->generic_enc_ctx;
5842 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )pak_context->private_enc_ctx;
5843 struct intel_batchbuffer *batch = encoder_context->base.batch;
5846 BEGIN_BCS_BATCH(batch, 65);
5848 OUT_BCS_BATCH(batch, MFX_PIPE_BUF_ADDR_STATE | (65 - 2));
5850 /* the DW1-3 is for pre_deblocking */
5851 OUT_BUFFER_3DW(batch, avc_ctx->res_pre_deblocking_output.bo, 1, 0, i965->intel.mocs_state);
5853 /* the DW4-6 is for the post_deblocking */
5854 OUT_BUFFER_3DW(batch, avc_ctx->res_post_deblocking_output.bo, 1, 0, i965->intel.mocs_state);
5856 /* the DW7-9 is for the uncompressed_picture */
5857 OUT_BUFFER_3DW(batch, generic_ctx->res_uncompressed_input_surface.bo, 0, 0, i965->intel.mocs_state);
5859 /* the DW10-12 is for PAK information (write) */
5860 OUT_BUFFER_3DW(batch, avc_ctx->res_pak_mb_status_buffer.bo, 1, 0, i965->intel.mocs_state);//?
5862 /* the DW13-15 is for the intra_row_store_scratch */
5863 OUT_BUFFER_3DW(batch, avc_ctx->res_intra_row_store_scratch_buffer.bo, 1, 0, i965->intel.mocs_state);
5865 /* the DW16-18 is for the deblocking filter */
5866 OUT_BUFFER_3DW(batch, avc_ctx->res_deblocking_filter_row_store_scratch_buffer.bo, 1, 0, i965->intel.mocs_state);
5868 /* the DW 19-50 is for Reference pictures*/
5869 for (i = 0; i < ARRAY_ELEMS(avc_ctx->list_reference_res); i++) {
5870 OUT_BUFFER_2DW(batch, avc_ctx->list_reference_res[i].bo, 0, 0);
5873 /* DW 51, reference picture attributes */
5874 OUT_BCS_BATCH(batch, i965->intel.mocs_state);
5876 /* The DW 52-54 is for PAK information (read) */
5877 OUT_BUFFER_3DW(batch, avc_ctx->res_pak_mb_status_buffer.bo, 1, 0, i965->intel.mocs_state);
5879 /* the DW 55-57 is the ILDB buffer */
5880 OUT_BUFFER_3DW(batch, NULL, 0, 0, 0);
5882 /* the DW 58-60 is the second ILDB buffer */
5883 OUT_BUFFER_3DW(batch, NULL, 0, 0, 0);
5885 /* DW 61, memory compress enable & mode */
5886 OUT_BCS_BATCH(batch, 0);
5888 /* the DW 62-64 is the buffer */
5889 OUT_BUFFER_3DW(batch, NULL, 0, 0, 0);
5891 ADVANCE_BCS_BATCH(batch);
5895 gen9_mfc_avc_ind_obj_base_addr_state(VADriverContextP ctx,
5896 struct encode_state *encode_state,
5897 struct intel_encoder_context *encoder_context)
5899 struct i965_driver_data *i965 = i965_driver_data(ctx);
5900 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5901 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )pak_context->generic_enc_ctx;
5902 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
5903 struct intel_batchbuffer *batch = encoder_context->base.batch;
5904 struct object_surface *obj_surface;
5905 struct gen9_surface_avc *avc_priv_surface;
5906 unsigned int size = 0;
5907 unsigned int w_mb = generic_state->frame_width_in_mbs;
5908 unsigned int h_mb = generic_state->frame_height_in_mbs;
5910 obj_surface = encode_state->reconstructed_object;
5912 if (!obj_surface || !obj_surface->private_data)
5914 avc_priv_surface = obj_surface->private_data;
5916 BEGIN_BCS_BATCH(batch, 26);
5918 OUT_BCS_BATCH(batch, MFX_IND_OBJ_BASE_ADDR_STATE | (26 - 2));
5919 /* The DW1-5 is for the MFX indirect bistream offset */
5920 OUT_BUFFER_3DW(batch, NULL, 0, 0, 0);
5921 OUT_BUFFER_2DW(batch, NULL, 0, 0);
5923 /* the DW6-10 is for MFX Indirect MV Object Base Address */
5924 size = w_mb * h_mb * 32 * 4;
5925 OUT_BUFFER_3DW(batch,
5926 avc_priv_surface->res_mv_data_surface.bo,
5929 i965->intel.mocs_state);
5930 OUT_BUFFER_2DW(batch,
5931 avc_priv_surface->res_mv_data_surface.bo,
5933 ALIGN(size,0x1000));
5935 /* The DW11-15 is for MFX IT-COFF. Not used on encoder */
5936 OUT_BUFFER_3DW(batch, NULL, 0, 0, 0);
5937 OUT_BUFFER_2DW(batch, NULL, 0, 0);
5939 /* The DW16-20 is for MFX indirect DBLK. Not used on encoder */
5940 OUT_BUFFER_3DW(batch, NULL, 0, 0, 0);
5941 OUT_BUFFER_2DW(batch, NULL, 0, 0);
5943 /* The DW21-25 is for MFC Indirect PAK-BSE Object Base Address for Encoder
5944 * Note: an offset is specified in MFX_AVC_SLICE_STATE
5946 OUT_BUFFER_3DW(batch,
5947 generic_ctx->compressed_bitstream.res.bo,
5950 i965->intel.mocs_state);
5951 OUT_BUFFER_2DW(batch,
5952 generic_ctx->compressed_bitstream.res.bo,
5954 generic_ctx->compressed_bitstream.end_offset);
5956 ADVANCE_BCS_BATCH(batch);
5960 gen9_mfc_avc_bsp_buf_base_addr_state(VADriverContextP ctx, struct intel_encoder_context *encoder_context)
5962 struct i965_driver_data *i965 = i965_driver_data(ctx);
5963 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5964 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )pak_context->private_enc_ctx;
5965 struct intel_batchbuffer *batch = encoder_context->base.batch;
5967 BEGIN_BCS_BATCH(batch, 10);
5969 OUT_BCS_BATCH(batch, MFX_BSP_BUF_BASE_ADDR_STATE | (10 - 2));
5971 /* The DW1-3 is for bsd/mpc row store scratch buffer */
5972 OUT_BUFFER_3DW(batch, avc_ctx->res_bsd_mpc_row_store_scratch_buffer.bo, 1, 0, i965->intel.mocs_state);
5974 /* The DW4-6 is for MPR Row Store Scratch Buffer Base Address, ignore for encoder */
5975 OUT_BUFFER_3DW(batch, NULL, 0, 0, 0);
5977 /* The DW7-9 is for Bitplane Read Buffer Base Address, ignore for encoder */
5978 OUT_BUFFER_3DW(batch, NULL, 0, 0, 0);
5980 ADVANCE_BCS_BATCH(batch);
5984 gen9_mfc_avc_directmode_state(VADriverContextP ctx,
5985 struct intel_encoder_context *encoder_context)
5987 struct i965_driver_data *i965 = i965_driver_data(ctx);
5988 struct intel_batchbuffer *batch = encoder_context->base.batch;
5989 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5990 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )pak_context->private_enc_ctx;
5991 struct avc_enc_state * avc_state = (struct avc_enc_state * )pak_context->private_enc_state;
5995 BEGIN_BCS_BATCH(batch, 71);
5997 OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (71 - 2));
5999 /* Reference frames and Current frames */
6000 /* the DW1-32 is for the direct MV for reference */
6001 for(i = 0; i < NUM_MFC_AVC_DMV_BUFFERS - 2; i += 2) {
6002 if ( avc_ctx->res_direct_mv_buffersr[i].bo != NULL) {
6003 OUT_BCS_RELOC64(batch, avc_ctx->res_direct_mv_buffersr[i].bo,
6004 I915_GEM_DOMAIN_INSTRUCTION, 0,
6007 OUT_BCS_BATCH(batch, 0);
6008 OUT_BCS_BATCH(batch, 0);
6012 OUT_BCS_BATCH(batch, i965->intel.mocs_state);
6014 /* the DW34-36 is the MV for the current frame */
6015 OUT_BCS_RELOC64(batch, avc_ctx->res_direct_mv_buffersr[NUM_MFC_AVC_DMV_BUFFERS - 2].bo,
6016 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
6019 OUT_BCS_BATCH(batch, i965->intel.mocs_state);
6022 for(i = 0; i < 32; i++) {
6023 OUT_BCS_BATCH(batch, avc_state->top_field_poc[i]);
6025 OUT_BCS_BATCH(batch, avc_state->top_field_poc[NUM_MFC_AVC_DMV_BUFFERS - 2]);
6026 OUT_BCS_BATCH(batch, avc_state->top_field_poc[NUM_MFC_AVC_DMV_BUFFERS - 1]);
6028 ADVANCE_BCS_BATCH(batch);
6032 gen9_mfc_qm_state(VADriverContextP ctx,
6034 const unsigned int *qm,
6036 struct intel_encoder_context *encoder_context)
6038 struct intel_batchbuffer *batch = encoder_context->base.batch;
6039 unsigned int qm_buffer[16];
6041 assert(qm_length <= 16);
6042 assert(sizeof(*qm) == 4);
6043 memset(qm_buffer,0,16*4);
6044 memcpy(qm_buffer, qm, qm_length * 4);
6046 BEGIN_BCS_BATCH(batch, 18);
6047 OUT_BCS_BATCH(batch, MFX_QM_STATE | (18 - 2));
6048 OUT_BCS_BATCH(batch, qm_type << 0);
6049 intel_batchbuffer_data(batch, qm_buffer, 16 * 4);
6050 ADVANCE_BCS_BATCH(batch);
6054 gen9_mfc_avc_qm_state(VADriverContextP ctx,
6055 struct encode_state *encode_state,
6056 struct intel_encoder_context *encoder_context)
6058 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6059 struct avc_enc_state * avc_state = (struct avc_enc_state * )pak_context->private_enc_state;
6060 VAEncSequenceParameterBufferH264 *seq_param = avc_state->seq_param;
6061 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
6064 const unsigned int *qm_4x4_intra;
6065 const unsigned int *qm_4x4_inter;
6066 const unsigned int *qm_8x8_intra;
6067 const unsigned int *qm_8x8_inter;
6069 if (!seq_param->seq_fields.bits.seq_scaling_matrix_present_flag
6070 && !pic_param->pic_fields.bits.pic_scaling_matrix_present_flag) {
6071 qm_4x4_intra = qm_4x4_inter = qm_8x8_intra = qm_8x8_inter = qm_flat;
6073 VAIQMatrixBufferH264 *qm;
6074 assert(encode_state->q_matrix && encode_state->q_matrix->buffer);
6075 qm = (VAIQMatrixBufferH264 *)encode_state->q_matrix->buffer;
6076 qm_4x4_intra = (unsigned int *)qm->ScalingList4x4[0];
6077 qm_4x4_inter = (unsigned int *)qm->ScalingList4x4[3];
6078 qm_8x8_intra = (unsigned int *)qm->ScalingList8x8[0];
6079 qm_8x8_inter = (unsigned int *)qm->ScalingList8x8[1];
6082 gen9_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm_4x4_intra, 12, encoder_context);
6083 gen9_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm_4x4_inter, 12, encoder_context);
6084 gen9_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm_8x8_intra, 16, encoder_context);
6085 gen9_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm_8x8_inter, 16, encoder_context);
6089 gen9_mfc_fqm_state(VADriverContextP ctx,
6091 const unsigned int *fqm,
6093 struct intel_encoder_context *encoder_context)
6095 struct intel_batchbuffer *batch = encoder_context->base.batch;
6096 unsigned int fqm_buffer[32];
6098 assert(fqm_length <= 32);
6099 assert(sizeof(*fqm) == 4);
6100 memset(fqm_buffer,0,32*4);
6101 memcpy(fqm_buffer, fqm, fqm_length * 4);
6103 BEGIN_BCS_BATCH(batch, 34);
6104 OUT_BCS_BATCH(batch, MFX_FQM_STATE | (34 - 2));
6105 OUT_BCS_BATCH(batch, fqm_type << 0);
6106 intel_batchbuffer_data(batch, fqm_buffer, 32 * 4);
6107 ADVANCE_BCS_BATCH(batch);
6111 gen9_mfc_fill_fqm(uint8_t *qm, uint16_t *fqm, int len)
6114 for (i = 0; i < len; i++)
6115 for (j = 0; j < len; j++)
6117 assert(qm[j * len + i]);
6118 fqm[i * len + j] = (1 << 16) / qm[j * len + i];
6123 gen9_mfc_avc_fqm_state(VADriverContextP ctx,
6124 struct encode_state *encode_state,
6125 struct intel_encoder_context *encoder_context)
6127 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6128 struct avc_enc_state * avc_state = (struct avc_enc_state * )pak_context->private_enc_state;
6129 VAEncSequenceParameterBufferH264 *seq_param = avc_state->seq_param;
6130 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
6132 if (!seq_param->seq_fields.bits.seq_scaling_matrix_present_flag
6133 && !pic_param->pic_fields.bits.pic_scaling_matrix_present_flag) {
6134 gen9_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, fqm_flat, 24, encoder_context);
6135 gen9_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, fqm_flat, 24, encoder_context);
6136 gen9_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, fqm_flat, 32, encoder_context);
6137 gen9_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, fqm_flat, 32, encoder_context);
6141 VAIQMatrixBufferH264 *qm;
6142 assert(encode_state->q_matrix && encode_state->q_matrix->buffer);
6143 qm = (VAIQMatrixBufferH264 *)encode_state->q_matrix->buffer;
6145 for (i = 0; i < 3; i++)
6146 gen9_mfc_fill_fqm(qm->ScalingList4x4[i], (uint16_t *)fqm + 16 * i, 4);
6147 gen9_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, fqm, 24, encoder_context);
6149 for (i = 3; i < 6; i++)
6150 gen9_mfc_fill_fqm(qm->ScalingList4x4[i], (uint16_t *)fqm + 16 * (i - 3), 4);
6151 gen9_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, fqm, 24, encoder_context);
6153 gen9_mfc_fill_fqm(qm->ScalingList8x8[0], (uint16_t *)fqm, 8);
6154 gen9_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, fqm, 32, encoder_context);
6156 gen9_mfc_fill_fqm(qm->ScalingList8x8[1], (uint16_t *)fqm, 8);
6157 gen9_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, fqm, 32, encoder_context);
6162 gen9_mfc_avc_insert_object(VADriverContextP ctx,
6163 struct intel_encoder_context *encoder_context,
6164 unsigned int *insert_data, int lenght_in_dws, int data_bits_in_last_dw,
6165 int skip_emul_byte_count, int is_last_header, int is_end_of_slice, int emulation_flag,
6166 int slice_header_indicator,
6167 struct intel_batchbuffer *batch)
6169 if (data_bits_in_last_dw == 0)
6170 data_bits_in_last_dw = 32;
6172 BEGIN_BCS_BATCH(batch, lenght_in_dws + 2);
6174 OUT_BCS_BATCH(batch, MFX_INSERT_OBJECT | (lenght_in_dws));
6175 OUT_BCS_BATCH(batch,
6176 (0 << 16) | /* always start at offset 0 */
6177 (slice_header_indicator << 14) |
6178 (data_bits_in_last_dw << 8) |
6179 (skip_emul_byte_count << 4) |
6180 (!!emulation_flag << 3) |
6181 ((!!is_last_header) << 2) |
6182 ((!!is_end_of_slice) << 1) |
6183 (0 << 0)); /* check this flag */
6184 intel_batchbuffer_data(batch, insert_data, lenght_in_dws * 4);
6186 ADVANCE_BCS_BATCH(batch);
6190 gen9_mfc_avc_insert_slice_packed_data(VADriverContextP ctx,
6191 struct encode_state *encode_state,
6192 struct intel_encoder_context *encoder_context,
6194 struct intel_batchbuffer *batch)
6196 VAEncPackedHeaderParameterBuffer *param = NULL;
6197 unsigned int length_in_bits;
6198 unsigned int *header_data = NULL;
6199 int count, i, start_index;
6200 int slice_header_index;
6202 if (encode_state->slice_header_index[slice_index] == 0)
6203 slice_header_index = -1;
6205 slice_header_index = (encode_state->slice_header_index[slice_index] & SLICE_PACKED_DATA_INDEX_MASK);
6207 count = encode_state->slice_rawdata_count[slice_index];
6208 start_index = (encode_state->slice_rawdata_index[slice_index] & SLICE_PACKED_DATA_INDEX_MASK);
6210 for (i = 0; i < count; i++) {
6211 unsigned int skip_emul_byte_cnt;
6213 header_data = (unsigned int *)encode_state->packed_header_data_ext[start_index + i]->buffer;
6215 param = (VAEncPackedHeaderParameterBuffer *)(encode_state->packed_header_params_ext[start_index + i]->buffer);
6217 /* skip the slice header packed data type as it is lastly inserted */
6218 if (param->type == VAEncPackedHeaderSlice)
6221 length_in_bits = param->bit_length;
6223 skip_emul_byte_cnt = intel_avc_find_skipemulcnt((unsigned char *)header_data, length_in_bits);
6225 /* as the slice header is still required, the last header flag is set to
6228 gen9_mfc_avc_insert_object(ctx,
6231 ALIGN(length_in_bits, 32) >> 5,
6232 length_in_bits & 0x1f,
6236 !param->has_emulation_bytes,
6241 if (slice_header_index == -1) {
6242 VAEncSequenceParameterBufferH264 *seq_param = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
6243 VAEncPictureParameterBufferH264 *pic_param = (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext->buffer;
6244 VAEncSliceParameterBufferH264 *slice_params = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[slice_index]->buffer;
6245 unsigned char *slice_header = NULL;
6246 int slice_header_length_in_bits = 0;
6248 /* No slice header data is passed. And the driver needs to generate it */
6249 /* For the Normal H264 */
6250 slice_header_length_in_bits = build_avc_slice_header(seq_param,
6254 gen9_mfc_avc_insert_object(ctx,
6256 (unsigned int *)slice_header,
6257 ALIGN(slice_header_length_in_bits, 32) >> 5,
6258 slice_header_length_in_bits & 0x1f,
6259 5, /* first 5 bytes are start code + nal unit type */
6266 unsigned int skip_emul_byte_cnt;
6268 header_data = (unsigned int *)encode_state->packed_header_data_ext[slice_header_index]->buffer;
6270 param = (VAEncPackedHeaderParameterBuffer *)(encode_state->packed_header_params_ext[slice_header_index]->buffer);
6271 length_in_bits = param->bit_length;
6273 /* as the slice header is the last header data for one slice,
6274 * the last header flag is set to one.
6276 skip_emul_byte_cnt = intel_avc_find_skipemulcnt((unsigned char *)header_data, length_in_bits);
6278 gen9_mfc_avc_insert_object(ctx,
6281 ALIGN(length_in_bits, 32) >> 5,
6282 length_in_bits & 0x1f,
6286 !param->has_emulation_bytes,
6295 gen9_mfc_avc_inset_headers(VADriverContextP ctx,
6296 struct encode_state *encode_state,
6297 struct intel_encoder_context *encoder_context,
6298 VAEncSliceParameterBufferH264 *slice_param,
6300 struct intel_batchbuffer *batch)
6302 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6303 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
6304 int idx = va_enc_packed_type_to_idx(VAEncPackedHeaderH264_SPS);
6305 unsigned int internal_rate_mode = generic_state->internal_rate_mode;
6306 unsigned int skip_emul_byte_cnt;
6308 if (slice_index == 0) {
6309 if (encode_state->packed_header_data[idx]) {
6310 VAEncPackedHeaderParameterBuffer *param = NULL;
6311 unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
6312 unsigned int length_in_bits;
6314 assert(encode_state->packed_header_param[idx]);
6315 param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
6316 length_in_bits = param->bit_length;
6318 skip_emul_byte_cnt = intel_avc_find_skipemulcnt((unsigned char *)header_data, length_in_bits);
6319 gen9_mfc_avc_insert_object(ctx,
6322 ALIGN(length_in_bits, 32) >> 5,
6323 length_in_bits & 0x1f,
6327 !param->has_emulation_bytes,
6332 idx = va_enc_packed_type_to_idx(VAEncPackedHeaderH264_PPS);
6334 if (encode_state->packed_header_data[idx]) {
6335 VAEncPackedHeaderParameterBuffer *param = NULL;
6336 unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
6337 unsigned int length_in_bits;
6339 assert(encode_state->packed_header_param[idx]);
6340 param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
6341 length_in_bits = param->bit_length;
6343 skip_emul_byte_cnt = intel_avc_find_skipemulcnt((unsigned char *)header_data, length_in_bits);
6345 gen9_mfc_avc_insert_object(ctx,
6348 ALIGN(length_in_bits, 32) >> 5,
6349 length_in_bits & 0x1f,
6353 !param->has_emulation_bytes,
6358 idx = va_enc_packed_type_to_idx(VAEncPackedHeaderH264_SEI);
6360 if (encode_state->packed_header_data[idx]) {
6361 VAEncPackedHeaderParameterBuffer *param = NULL;
6362 unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
6363 unsigned int length_in_bits;
6365 assert(encode_state->packed_header_param[idx]);
6366 param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
6367 length_in_bits = param->bit_length;
6369 skip_emul_byte_cnt = intel_avc_find_skipemulcnt((unsigned char *)header_data, length_in_bits);
6370 gen9_mfc_avc_insert_object(ctx,
6373 ALIGN(length_in_bits, 32) >> 5,
6374 length_in_bits & 0x1f,
6378 !param->has_emulation_bytes,
6381 } else if (internal_rate_mode == VA_RC_CBR) {
6386 gen9_mfc_avc_insert_slice_packed_data(ctx,
6394 gen9_mfc_avc_slice_state(VADriverContextP ctx,
6395 struct encode_state *encode_state,
6396 struct intel_encoder_context *encoder_context,
6397 VAEncPictureParameterBufferH264 *pic_param,
6398 VAEncSliceParameterBufferH264 *slice_param,
6399 VAEncSliceParameterBufferH264 *next_slice_param,
6400 struct intel_batchbuffer *batch)
6402 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6403 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )pak_context->generic_enc_ctx;
6404 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
6405 struct avc_enc_state * avc_state = (struct avc_enc_state * )pak_context->private_enc_state;
6406 unsigned int luma_log2_weight_denom = slice_param->luma_log2_weight_denom;
6407 unsigned int chroma_log2_weight_denom = slice_param->chroma_log2_weight_denom;
6408 unsigned char correct[6], grow, shrink;
6409 int slice_hor_pos, slice_ver_pos, next_slice_hor_pos, next_slice_ver_pos;
6410 int max_qp_n, max_qp_p;
6412 int weighted_pred_idc = 0;
6413 int num_ref_l0 = 0, num_ref_l1 = 0;
6414 int slice_type = intel_avc_enc_slice_type_fixup(slice_param->slice_type);
6415 int slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
6416 unsigned int rc_panic_enable = 0;
6417 unsigned int rate_control_counter_enable = 0;
6418 unsigned int rounding_value = 0;
6419 unsigned int rounding_inter_enable = 0;
6421 //check the inter rounding
6422 if(generic_state->frame_type == SLICE_TYPE_P)
6424 if(avc_state->rounding_inter_p == AVC_INVALID_ROUNDING_VALUE)
6426 if(avc_state->adaptive_rounding_inter_enable && !(generic_state->brc_enabled))
6428 if(generic_state->gop_ref_distance == 1)
6429 avc_state->rounding_value = gen9_avc_adaptive_inter_rounding_p_without_b[slice_qp];
6431 avc_state->rounding_value = gen9_avc_adaptive_inter_rounding_p[slice_qp];
6435 avc_state->rounding_value = gen9_avc_inter_rounding_p[generic_state->preset];
6440 avc_state->rounding_value = avc_state->rounding_inter_p;
6442 }else if(generic_state->frame_type == SLICE_TYPE_B)
6444 if(pic_param->pic_fields.bits.reference_pic_flag)
6446 if(avc_state->rounding_inter_b_ref == AVC_INVALID_ROUNDING_VALUE)
6447 avc_state->rounding_value = gen9_avc_inter_rounding_b_ref[generic_state->preset];
6449 avc_state->rounding_value = avc_state->rounding_inter_b_ref;
6453 if(avc_state->rounding_inter_b == AVC_INVALID_ROUNDING_VALUE)
6455 if(avc_state->adaptive_rounding_inter_enable && !(generic_state->brc_enabled))
6456 avc_state->rounding_value = gen9_avc_adaptive_inter_rounding_b[slice_qp];
6458 avc_state->rounding_value = gen9_avc_inter_rounding_b[generic_state->preset];
6461 avc_state->rounding_value = avc_state->rounding_inter_b;
6466 slice_hor_pos = slice_param->macroblock_address % generic_state->frame_width_in_mbs;
6467 slice_ver_pos = slice_param->macroblock_address / generic_state->frame_width_in_mbs;
6469 if (next_slice_param) {
6470 next_slice_hor_pos = next_slice_param->macroblock_address % generic_state->frame_width_in_mbs;
6471 next_slice_ver_pos = next_slice_param->macroblock_address / generic_state->frame_width_in_mbs;
6473 next_slice_hor_pos = 0;
6474 next_slice_ver_pos = generic_state->frame_height_in_mbs;
6477 if (slice_type == SLICE_TYPE_I) {
6478 luma_log2_weight_denom = 0;
6479 chroma_log2_weight_denom = 0;
6480 } else if (slice_type == SLICE_TYPE_P) {
6481 weighted_pred_idc = pic_param->pic_fields.bits.weighted_pred_flag;
6482 num_ref_l0 = pic_param->num_ref_idx_l0_active_minus1 + 1;
6483 rounding_inter_enable = avc_state->rounding_inter_enable;
6484 rounding_value = avc_state->rounding_value;
6486 if (slice_param->num_ref_idx_active_override_flag)
6487 num_ref_l0 = slice_param->num_ref_idx_l0_active_minus1 + 1;
6488 } else if (slice_type == SLICE_TYPE_B) {
6489 weighted_pred_idc = pic_param->pic_fields.bits.weighted_bipred_idc;
6490 num_ref_l0 = pic_param->num_ref_idx_l0_active_minus1 + 1;
6491 num_ref_l1 = pic_param->num_ref_idx_l1_active_minus1 + 1;
6492 rounding_inter_enable = avc_state->rounding_inter_enable;
6493 rounding_value = avc_state->rounding_value;
6495 if (slice_param->num_ref_idx_active_override_flag) {
6496 num_ref_l0 = slice_param->num_ref_idx_l0_active_minus1 + 1;
6497 num_ref_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1;
6500 if (weighted_pred_idc == 2) {
6501 /* 8.4.3 - Derivation process for prediction weights (8-279) */
6502 luma_log2_weight_denom = 5;
6503 chroma_log2_weight_denom = 5;
6512 rate_control_counter_enable = (generic_state->brc_enabled && (generic_state->curr_pak_pass != 0));
6513 rc_panic_enable = (avc_state->rc_panic_enable &&
6514 (!avc_state->min_max_qp_enable) &&
6515 (encoder_context->rate_control_mode != VA_RC_CQP) &&
6516 (generic_state->curr_pak_pass == (generic_state->num_pak_passes - 1)));
6518 for (i = 0; i < 6; i++)
6521 BEGIN_BCS_BATCH(batch, 11);
6523 OUT_BCS_BATCH(batch, MFX_AVC_SLICE_STATE | (11 - 2) );
6524 OUT_BCS_BATCH(batch, slice_type);
6525 OUT_BCS_BATCH(batch,
6526 (num_ref_l1 << 24) |
6527 (num_ref_l0 << 16) |
6528 (chroma_log2_weight_denom << 8) |
6529 (luma_log2_weight_denom << 0));
6530 OUT_BCS_BATCH(batch,
6531 (weighted_pred_idc << 30) |
6532 (((slice_type == SLICE_TYPE_B)?slice_param->direct_spatial_mv_pred_flag:0) << 29) |
6533 (slice_param->disable_deblocking_filter_idc << 27) |
6534 (slice_param->cabac_init_idc << 24) |
6536 ((slice_param->slice_beta_offset_div2 & 0xf) << 8) |
6537 ((slice_param->slice_alpha_c0_offset_div2 & 0xf) << 0));
6539 OUT_BCS_BATCH(batch,
6540 slice_ver_pos << 24 |
6541 slice_hor_pos << 16 |
6542 slice_param->macroblock_address);
6543 OUT_BCS_BATCH(batch,
6544 next_slice_ver_pos << 16 |
6545 next_slice_hor_pos);
6547 OUT_BCS_BATCH(batch,
6548 (rate_control_counter_enable << 31) |
6549 (1 << 30) | /* ResetRateControlCounter */
6550 (2 << 28) | /* Loose Rate Control */
6551 (0 << 24) | /* RC Stable Tolerance */
6552 (rc_panic_enable << 23) | /* RC Panic Enable */
6553 (1 << 22) | /* CBP mode */
6554 (0 << 21) | /* MB Type Direct Conversion, 0: Enable, 1: Disable */
6555 (0 << 20) | /* MB Type Skip Conversion, 0: Enable, 1: Disable */
6556 (!next_slice_param << 19) | /* Is Last Slice */
6557 (0 << 18) | /* BitstreamOutputFlag Compressed BitStream Output Disable Flag 0:enable 1:disable */
6558 (1 << 17) | /* HeaderPresentFlag */
6559 (1 << 16) | /* SliceData PresentFlag */
6560 (0 << 15) | /* TailPresentFlag */
6561 (1 << 13) | /* RBSP NAL TYPE */
6562 (1 << 12)); /* CabacZeroWordInsertionEnable */
6564 OUT_BCS_BATCH(batch, generic_ctx->compressed_bitstream.start_offset);
6566 OUT_BCS_BATCH(batch,
6567 (max_qp_n << 24) | /*Target QP - 24 is lowest QP*/
6568 (max_qp_p << 16) | /*Target QP + 20 is highest QP*/
6571 OUT_BCS_BATCH(batch,
6572 (rounding_inter_enable << 31) |
6573 (rounding_value << 28) |
6576 (correct[5] << 20) |
6577 (correct[4] << 16) |
6578 (correct[3] << 12) |
6582 OUT_BCS_BATCH(batch, 0);
6584 ADVANCE_BCS_BATCH(batch);
6588 gen9_mfc_avc_get_ref_idx_state(VAPictureH264 *va_pic, unsigned int frame_store_id)
6590 unsigned int is_long_term =
6591 !!(va_pic->flags & VA_PICTURE_H264_LONG_TERM_REFERENCE);
6592 unsigned int is_top_field =
6593 !!(va_pic->flags & VA_PICTURE_H264_TOP_FIELD);
6594 unsigned int is_bottom_field =
6595 !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD);
6597 return ((is_long_term << 6) |
6599 (frame_store_id << 1) |
6600 ((is_top_field ^ 1) & is_bottom_field));
6604 gen9_mfc_avc_ref_idx_state(VADriverContextP ctx,
6605 struct encode_state *encode_state,
6606 struct intel_encoder_context *encoder_context,
6607 VAEncSliceParameterBufferH264 *slice_param,
6608 struct intel_batchbuffer *batch)
6610 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6611 struct avc_enc_state * avc_state = (struct avc_enc_state * )pak_context->private_enc_state;
6612 VAPictureH264 *ref_pic;
6613 int i, slice_type, ref_idx_shift;
6614 unsigned int fwd_ref_entry;
6615 unsigned int bwd_ref_entry;
6617 /* max 4 ref frames are allowed for l0 and l1 */
6618 fwd_ref_entry = 0x80808080;
6619 slice_type = intel_avc_enc_slice_type_fixup(slice_param->slice_type);
6621 if ((slice_type == SLICE_TYPE_P) ||
6622 (slice_type == SLICE_TYPE_B)) {
6623 for (i = 0; i < MIN(avc_state->num_refs[0],4); i++) {
6624 ref_pic = &slice_param->RefPicList0[i];
6625 ref_idx_shift = i * 8;
6627 fwd_ref_entry &= ~(0xFF << ref_idx_shift);
6628 fwd_ref_entry += (gen9_mfc_avc_get_ref_idx_state(ref_pic, avc_state->list_ref_idx[0][i]) << ref_idx_shift);
6632 bwd_ref_entry = 0x80808080;
6633 if (slice_type == SLICE_TYPE_B) {
6634 for (i = 0; i < MIN(avc_state->num_refs[1],4); i++) {
6635 ref_pic = &slice_param->RefPicList1[i];
6636 ref_idx_shift = i * 8;
6638 bwd_ref_entry &= ~(0xFF << ref_idx_shift);
6639 bwd_ref_entry += (gen9_mfc_avc_get_ref_idx_state(ref_pic, avc_state->list_ref_idx[1][i]) << ref_idx_shift);
6643 if ((slice_type == SLICE_TYPE_P) ||
6644 (slice_type == SLICE_TYPE_B)) {
6645 BEGIN_BCS_BATCH(batch, 10);
6646 OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | 8);
6647 OUT_BCS_BATCH(batch, 0); // L0
6648 OUT_BCS_BATCH(batch, fwd_ref_entry);
6650 for (i = 0; i < 7; i++) {
6651 OUT_BCS_BATCH(batch, 0x80808080);
6654 ADVANCE_BCS_BATCH(batch);
6657 if (slice_type == SLICE_TYPE_B) {
6658 BEGIN_BCS_BATCH(batch, 10);
6659 OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | 8);
6660 OUT_BCS_BATCH(batch, 1); //Select L1
6661 OUT_BCS_BATCH(batch, bwd_ref_entry); //max 4 reference allowed
6662 for(i = 0; i < 7; i++) {
6663 OUT_BCS_BATCH(batch, 0x80808080);
6665 ADVANCE_BCS_BATCH(batch);
6670 gen9_mfc_avc_weightoffset_state(VADriverContextP ctx,
6671 struct encode_state *encode_state,
6672 struct intel_encoder_context *encoder_context,
6673 VAEncPictureParameterBufferH264 *pic_param,
6674 VAEncSliceParameterBufferH264 *slice_param,
6675 struct intel_batchbuffer *batch)
6678 short weightoffsets[32 * 6];
6680 slice_type = intel_avc_enc_slice_type_fixup(slice_param->slice_type);
6682 if (slice_type == SLICE_TYPE_P &&
6683 pic_param->pic_fields.bits.weighted_pred_flag == 1) {
6684 memset(weightoffsets,0,32*6 * sizeof(short));
6685 for (i = 0; i < 32; i++) {
6686 weightoffsets[i * 6 + 0] = slice_param->luma_weight_l0[i];
6687 weightoffsets[i * 6 + 1] = slice_param->luma_offset_l0[i];
6688 weightoffsets[i * 6 + 2] = slice_param->chroma_weight_l0[i][0];
6689 weightoffsets[i * 6 + 3] = slice_param->chroma_offset_l0[i][0];
6690 weightoffsets[i * 6 + 4] = slice_param->chroma_weight_l0[i][1];
6691 weightoffsets[i * 6 + 5] = slice_param->chroma_offset_l0[i][1];
6694 BEGIN_BCS_BATCH(batch, 98);
6695 OUT_BCS_BATCH(batch, MFX_AVC_WEIGHTOFFSET_STATE | (98 - 2));
6696 OUT_BCS_BATCH(batch, 0);
6697 intel_batchbuffer_data(batch, weightoffsets, sizeof(weightoffsets));
6699 ADVANCE_BCS_BATCH(batch);
6702 if (slice_type == SLICE_TYPE_B &&
6703 (pic_param->pic_fields.bits.weighted_bipred_idc == 1)) {
6704 memset(weightoffsets,0,32*6 * sizeof(short));
6705 for (i = 0; i < 32; i++) {
6706 weightoffsets[i * 6 + 0] = slice_param->luma_weight_l0[i];
6707 weightoffsets[i * 6 + 1] = slice_param->luma_offset_l0[i];
6708 weightoffsets[i * 6 + 2] = slice_param->chroma_weight_l0[i][0];
6709 weightoffsets[i * 6 + 3] = slice_param->chroma_offset_l0[i][0];
6710 weightoffsets[i * 6 + 4] = slice_param->chroma_weight_l0[i][1];
6711 weightoffsets[i * 6 + 5] = slice_param->chroma_offset_l0[i][1];
6714 BEGIN_BCS_BATCH(batch, 98);
6715 OUT_BCS_BATCH(batch, MFX_AVC_WEIGHTOFFSET_STATE | (98 - 2));
6716 OUT_BCS_BATCH(batch, 0);
6717 intel_batchbuffer_data(batch, weightoffsets, sizeof(weightoffsets));
6718 ADVANCE_BCS_BATCH(batch);
6720 memset(weightoffsets,0,32*6 * sizeof(short));
6721 for (i = 0; i < 32; i++) {
6722 weightoffsets[i * 6 + 0] = slice_param->luma_weight_l1[i];
6723 weightoffsets[i * 6 + 1] = slice_param->luma_offset_l1[i];
6724 weightoffsets[i * 6 + 2] = slice_param->chroma_weight_l1[i][0];
6725 weightoffsets[i * 6 + 3] = slice_param->chroma_offset_l1[i][0];
6726 weightoffsets[i * 6 + 4] = slice_param->chroma_weight_l1[i][1];
6727 weightoffsets[i * 6 + 5] = slice_param->chroma_offset_l1[i][1];
6730 BEGIN_BCS_BATCH(batch, 98);
6731 OUT_BCS_BATCH(batch, MFX_AVC_WEIGHTOFFSET_STATE | (98 - 2));
6732 OUT_BCS_BATCH(batch, 1);
6733 intel_batchbuffer_data(batch, weightoffsets, sizeof(weightoffsets));
6734 ADVANCE_BCS_BATCH(batch);
6739 gen9_mfc_avc_single_slice(VADriverContextP ctx,
6740 struct encode_state *encode_state,
6741 struct intel_encoder_context *encoder_context,
6742 VAEncSliceParameterBufferH264 *slice_param,
6743 VAEncSliceParameterBufferH264 *next_slice_param,
6746 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6747 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )pak_context->private_enc_ctx;
6748 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
6749 struct avc_enc_state * avc_state = (struct avc_enc_state * )pak_context->private_enc_state;
6750 struct intel_batchbuffer *batch = encoder_context->base.batch;
6751 struct intel_batchbuffer *slice_batch = avc_ctx->pres_slice_batch_buffer_2nd_level;
6752 VAEncPictureParameterBufferH264 *pic_param = (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext->buffer;
6753 struct gpe_mi_batch_buffer_start_parameter second_level_batch;
6754 struct object_surface *obj_surface;
6755 struct gen9_surface_avc *avc_priv_surface;
6757 unsigned int slice_offset = 0;
6759 if(generic_state->curr_pak_pass == 0)
6761 slice_offset = intel_batchbuffer_used_size(slice_batch);
6762 avc_state->slice_batch_offset[slice_index] = slice_offset;
6763 gen9_mfc_avc_ref_idx_state(ctx, encode_state, encoder_context, slice_param,slice_batch);
6764 gen9_mfc_avc_weightoffset_state(ctx,
6770 gen9_mfc_avc_slice_state(ctx,
6777 gen9_mfc_avc_inset_headers(ctx,
6784 BEGIN_BCS_BATCH(slice_batch, 2);
6785 OUT_BCS_BATCH(slice_batch, 0);
6786 OUT_BCS_BATCH(slice_batch, MI_BATCH_BUFFER_END);
6787 ADVANCE_BCS_BATCH(slice_batch);
6791 slice_offset = avc_state->slice_batch_offset[slice_index];
6793 /* insert slice as second levle.*/
6794 memset(&second_level_batch, 0, sizeof(second_level_batch));
6795 second_level_batch.is_second_level = 1; /* Must be the second level batch buffer */
6796 second_level_batch.offset = slice_offset;
6797 second_level_batch.bo = slice_batch->buffer;
6798 gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
6800 /* insert mb code as second levle.*/
6801 obj_surface = encode_state->reconstructed_object;
6802 assert(obj_surface->private_data);
6803 avc_priv_surface = (struct gen9_surface_avc *)obj_surface->private_data;
6805 memset(&second_level_batch, 0, sizeof(second_level_batch));
6806 second_level_batch.is_second_level = 1; /* Must be the second level batch buffer */
6807 second_level_batch.offset = slice_param->macroblock_address * 16 * 4;
6808 second_level_batch.bo = avc_priv_surface->res_mb_code_surface.bo;
6809 gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
6814 gen9_avc_pak_slice_level(VADriverContextP ctx,
6815 struct encode_state *encode_state,
6816 struct intel_encoder_context *encoder_context)
6818 struct intel_batchbuffer *batch = encoder_context->base.batch;
6819 struct gpe_mi_flush_dw_parameter mi_flush_dw_params;
6820 VAEncSliceParameterBufferH264 *slice_param, *next_slice_param, *next_slice_group_param;
6822 int slice_index = 0;
6823 int is_frame_level = 1; /* check it for SKL,now single slice per frame */
6824 int has_tail = 0; /* check it later */
6826 for (j = 0; j < encode_state->num_slice_params_ext; j++) {
6827 slice_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[j]->buffer;
6829 if (j == encode_state->num_slice_params_ext - 1)
6830 next_slice_group_param = NULL;
6832 next_slice_group_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[j + 1]->buffer;
6834 for (i = 0; i < encode_state->slice_params_ext[j]->num_elements; i++) {
6835 if (i < encode_state->slice_params_ext[j]->num_elements - 1)
6836 next_slice_param = slice_param + 1;
6838 next_slice_param = next_slice_group_param;
6840 gen9_mfc_avc_single_slice(ctx,
6852 /* remove assert(0) and add other commands here */
6862 /* insert a tail if required */
6865 memset(&mi_flush_dw_params, 0, sizeof(mi_flush_dw_params));
6866 mi_flush_dw_params.video_pipeline_cache_invalidate = 1;
6867 gen8_gpe_mi_flush_dw(ctx, batch, &mi_flush_dw_params);
6870 gen9_avc_pak_picture_level(VADriverContextP ctx,
6871 struct encode_state *encode_state,
6872 struct intel_encoder_context *encoder_context)
6874 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6875 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )pak_context->generic_enc_ctx;
6876 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )pak_context->private_enc_ctx;
6877 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
6878 struct gpe_mi_batch_buffer_start_parameter second_level_batch;
6879 struct intel_batchbuffer *batch = encoder_context->base.batch;
6881 if (generic_state->brc_enabled &&
6882 generic_state->curr_pak_pass) {
6883 struct gpe_mi_conditional_batch_buffer_end_parameter mi_conditional_batch_buffer_end_params;
6884 struct encoder_status_buffer_internal *status_buffer;
6885 status_buffer = &(avc_ctx->status_buffer);
6887 memset(&mi_conditional_batch_buffer_end_params, 0, sizeof(mi_conditional_batch_buffer_end_params));
6888 mi_conditional_batch_buffer_end_params.offset = status_buffer->image_status_mask_offset;
6889 mi_conditional_batch_buffer_end_params.bo = status_buffer->bo;
6890 mi_conditional_batch_buffer_end_params.compare_data = 0;
6891 mi_conditional_batch_buffer_end_params.compare_mask_mode_disabled = 0;
6892 gen9_gpe_mi_conditional_batch_buffer_end(ctx, batch, &mi_conditional_batch_buffer_end_params);
6895 gen9_mfc_avc_pipe_mode_select(ctx,encode_state,encoder_context);
6896 gen9_mfc_avc_surface_state(ctx,encoder_context,&(generic_ctx->res_reconstructed_surface),0);
6897 gen9_mfc_avc_surface_state(ctx,encoder_context,&(generic_ctx->res_uncompressed_input_surface),4);
6898 gen9_mfc_avc_pipe_buf_addr_state(ctx,encoder_context);
6899 gen9_mfc_avc_ind_obj_base_addr_state(ctx,encode_state,encoder_context);
6900 gen9_mfc_avc_bsp_buf_base_addr_state(ctx,encoder_context);
6902 if(generic_state->brc_enabled)
6904 memset(&second_level_batch, 0, sizeof(second_level_batch));
6905 if (generic_state->curr_pak_pass == 0) {
6906 second_level_batch.offset = 0;
6908 second_level_batch.offset = generic_state->curr_pak_pass * INTEL_AVC_IMAGE_STATE_CMD_SIZE;
6910 second_level_batch.is_second_level = 1;
6911 second_level_batch.bo = avc_ctx->res_brc_image_state_read_buffer.bo;
6912 gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
6915 /*generate a new image state */
6916 gen9_avc_set_image_state_non_brc(ctx,encode_state,encoder_context,&(avc_ctx->res_image_state_batch_buffer_2nd_level));
6917 memset(&second_level_batch, 0, sizeof(second_level_batch));
6918 second_level_batch.offset = 0;
6919 second_level_batch.is_second_level = 1;
6920 second_level_batch.bo = avc_ctx->res_image_state_batch_buffer_2nd_level.bo;
6921 gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
6924 gen9_mfc_avc_qm_state(ctx,encode_state,encoder_context);
6925 gen9_mfc_avc_fqm_state(ctx,encode_state,encoder_context);
6926 gen9_mfc_avc_directmode_state(ctx,encoder_context);
6931 gen9_avc_read_mfc_status(VADriverContextP ctx, struct intel_encoder_context *encoder_context)
6933 struct intel_batchbuffer *batch = encoder_context->base.batch;
6934 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6935 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )pak_context->private_enc_ctx;
6936 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
6938 struct gpe_mi_store_register_mem_parameter mi_store_reg_mem_param;
6939 struct gpe_mi_store_data_imm_parameter mi_store_data_imm_param;
6940 struct gpe_mi_flush_dw_parameter mi_flush_dw_param;
6941 struct encoder_status_buffer_internal *status_buffer;
6943 status_buffer = &(avc_ctx->status_buffer);
6945 memset(&mi_flush_dw_param, 0, sizeof(mi_flush_dw_param));
6946 gen8_gpe_mi_flush_dw(ctx, batch, &mi_flush_dw_param);
6948 /* read register and store into status_buffer and pak_statitistic info */
6949 memset(&mi_store_reg_mem_param, 0, sizeof(mi_store_reg_mem_param));
6950 mi_store_reg_mem_param.bo = status_buffer->bo;
6951 mi_store_reg_mem_param.offset = status_buffer->bs_byte_count_frame_offset;
6952 mi_store_reg_mem_param.mmio_offset = status_buffer->bs_byte_count_frame_reg_offset;
6953 gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
6955 mi_store_reg_mem_param.bo = status_buffer->bo;
6956 mi_store_reg_mem_param.offset = status_buffer->image_status_mask_offset;
6957 mi_store_reg_mem_param.mmio_offset = status_buffer->image_status_mask_reg_offset;
6958 gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
6960 /*update the status in the pak_statistic_surface */
6961 mi_store_reg_mem_param.bo = avc_ctx->res_brc_pre_pak_statistics_output_buffer.bo;
6962 mi_store_reg_mem_param.offset = 0;
6963 mi_store_reg_mem_param.mmio_offset = status_buffer->bs_byte_count_frame_reg_offset;
6964 gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
6966 mi_store_reg_mem_param.bo = avc_ctx->res_brc_pre_pak_statistics_output_buffer.bo;
6967 mi_store_reg_mem_param.offset = 4;
6968 mi_store_reg_mem_param.mmio_offset = status_buffer->bs_byte_count_frame_nh_reg_offset;
6969 gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
6971 memset(&mi_store_data_imm_param, 0, sizeof(mi_store_data_imm_param));
6972 mi_store_data_imm_param.bo = avc_ctx->res_brc_pre_pak_statistics_output_buffer.bo;
6973 mi_store_data_imm_param.offset = sizeof(unsigned int) * 2;
6974 mi_store_data_imm_param.dw0 = (generic_state->curr_pak_pass + 1);
6975 gen8_gpe_mi_store_data_imm(ctx, batch, &mi_store_data_imm_param);
6977 mi_store_reg_mem_param.bo = avc_ctx->res_brc_pre_pak_statistics_output_buffer.bo;
6978 mi_store_reg_mem_param.offset = sizeof(unsigned int) * (4 + generic_state->curr_pak_pass) ;
6979 mi_store_reg_mem_param.mmio_offset = status_buffer->image_status_ctrl_reg_offset;
6980 gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
6982 memset(&mi_flush_dw_param, 0, sizeof(mi_flush_dw_param));
6983 gen8_gpe_mi_flush_dw(ctx, batch, &mi_flush_dw_param);
6989 gen9_avc_pak_brc_prepare(struct encode_state *encode_state,
6990 struct intel_encoder_context *encoder_context)
6992 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6993 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
6994 unsigned int rate_control_mode = encoder_context->rate_control_mode;
6996 switch (rate_control_mode & 0x7f) {
6998 generic_state->internal_rate_mode = VA_RC_CBR;
7002 generic_state->internal_rate_mode = VA_RC_VBR;//AVBR
7007 generic_state->internal_rate_mode = VA_RC_CQP;
7011 if (encoder_context->quality_level == 0)
\r
7012 encoder_context->quality_level = ENCODER_DEFAULT_QUALITY_AVC;
\r
7016 gen9_avc_pak_pipeline_prepare(VADriverContextP ctx,
7017 struct encode_state *encode_state,
7018 struct intel_encoder_context *encoder_context)
7021 struct i965_driver_data *i965 = i965_driver_data(ctx);
7022 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
7023 struct generic_encoder_context * generic_ctx = (struct generic_encoder_context * )pak_context->generic_enc_ctx;
7024 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )pak_context->private_enc_ctx;
7025 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )pak_context->generic_enc_state;
7026 struct avc_enc_state * avc_state = (struct avc_enc_state * )pak_context->private_enc_state;
7028 struct object_surface *obj_surface;
7029 VAEncPictureParameterBufferH264 *pic_param = avc_state->pic_param;
7030 VAEncSliceParameterBufferH264 *slice_param = avc_state->slice_param[0];
7032 struct gen9_surface_avc *avc_priv_surface;
7033 int i, j, enable_avc_ildb = 0;
7034 unsigned int allocate_flag = 1;
7036 unsigned int w_mb = generic_state->frame_width_in_mbs;
7037 unsigned int h_mb = generic_state->frame_height_in_mbs;
7038 struct avc_surface_param surface_param;
7040 /* update the parameter and check slice parameter */
7041 for (j = 0; j < encode_state->num_slice_params_ext && enable_avc_ildb == 0; j++) {
7042 assert(encode_state->slice_params_ext && encode_state->slice_params_ext[j]->buffer);
7043 slice_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[j]->buffer;
7045 for (i = 0; i < encode_state->slice_params_ext[j]->num_elements; i++) {
7046 assert((slice_param->slice_type == SLICE_TYPE_I) ||
7047 (slice_param->slice_type == SLICE_TYPE_SI) ||
7048 (slice_param->slice_type == SLICE_TYPE_P) ||
7049 (slice_param->slice_type == SLICE_TYPE_SP) ||
7050 (slice_param->slice_type == SLICE_TYPE_B));
7052 if (slice_param->disable_deblocking_filter_idc != 1) {
7053 enable_avc_ildb = 1;
7060 avc_state->enable_avc_ildb = enable_avc_ildb;
7062 /* setup the all surface and buffer for PAK */
7063 /* Setup current reconstruct frame */
7064 obj_surface = encode_state->reconstructed_object;
7065 va_status = i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC_NV12, SUBSAMPLE_YUV420);
7067 if (va_status != VA_STATUS_SUCCESS)
7070 memset(&surface_param,0,sizeof(surface_param));
7071 surface_param.frame_width = generic_state->frame_width_in_pixel;
7072 surface_param.frame_height = generic_state->frame_height_in_pixel;
7073 va_status = gen9_avc_init_check_surfaces(ctx,
7074 obj_surface,encoder_context,
7076 if (va_status != VA_STATUS_SUCCESS)
7078 /* init the member of avc_priv_surface,frame_store_id,qp_value */
7080 avc_priv_surface = (struct gen9_surface_avc *)obj_surface->private_data;
7081 avc_state->top_field_poc[NUM_MFC_AVC_DMV_BUFFERS-2] = 0;
7082 avc_state->top_field_poc[NUM_MFC_AVC_DMV_BUFFERS-1] = 0;
7083 i965_free_gpe_resource(&avc_ctx->res_direct_mv_buffersr[NUM_MFC_AVC_DMV_BUFFERS-2]);
7084 i965_free_gpe_resource(&avc_ctx->res_direct_mv_buffersr[NUM_MFC_AVC_DMV_BUFFERS-1]);
7085 i965_dri_object_to_buffer_gpe_resource(&avc_ctx->res_direct_mv_buffersr[NUM_MFC_AVC_DMV_BUFFERS-2],avc_priv_surface->dmv_top);
7086 i965_dri_object_to_buffer_gpe_resource(&avc_ctx->res_direct_mv_buffersr[NUM_MFC_AVC_DMV_BUFFERS-1],avc_priv_surface->dmv_bottom);
7087 avc_priv_surface->qp_value = pic_param->pic_init_qp + slice_param->slice_qp_delta;
7088 avc_priv_surface->frame_store_id = 0;
7089 avc_priv_surface->frame_idx = pic_param->CurrPic.frame_idx;
7090 avc_priv_surface->top_field_order_cnt = pic_param->CurrPic.TopFieldOrderCnt;
7091 avc_priv_surface->is_as_ref = pic_param->pic_fields.bits.reference_pic_flag;
7092 avc_state->top_field_poc[NUM_MFC_AVC_DMV_BUFFERS-2] = avc_priv_surface->top_field_order_cnt;
7093 avc_state->top_field_poc[NUM_MFC_AVC_DMV_BUFFERS-1] = avc_priv_surface->top_field_order_cnt + 1;
7095 i965_free_gpe_resource(&generic_ctx->res_reconstructed_surface);
7096 i965_free_gpe_resource(&avc_ctx->res_post_deblocking_output);
7097 i965_free_gpe_resource(&avc_ctx->res_pre_deblocking_output);
7098 i965_object_surface_to_2d_gpe_resource_with_align(&generic_ctx->res_reconstructed_surface, obj_surface,GPE_RESOURCE_ALIGNMENT);
7101 if (avc_state->enable_avc_ildb) {
7102 i965_object_surface_to_2d_gpe_resource_with_align(&avc_ctx->res_post_deblocking_output, obj_surface,GPE_RESOURCE_ALIGNMENT);
7104 i965_object_surface_to_2d_gpe_resource_with_align(&avc_ctx->res_pre_deblocking_output, obj_surface,GPE_RESOURCE_ALIGNMENT);
7106 /* input YUV surface */
7107 obj_surface = encode_state->input_yuv_object;
7108 va_status = i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC_NV12, SUBSAMPLE_YUV420);
7110 if (va_status != VA_STATUS_SUCCESS)
7112 i965_free_gpe_resource(&generic_ctx->res_uncompressed_input_surface);
7113 i965_object_surface_to_2d_gpe_resource_with_align(&generic_ctx->res_uncompressed_input_surface, obj_surface,GPE_RESOURCE_ALIGNMENT);
7115 /* Reference surfaces */
7116 for (i = 0; i < ARRAY_ELEMS(avc_ctx->list_reference_res); i++) {
7117 i965_free_gpe_resource(&avc_ctx->list_reference_res[i]);
7118 i965_free_gpe_resource(&avc_ctx->res_direct_mv_buffersr[i*2]);
7119 i965_free_gpe_resource(&avc_ctx->res_direct_mv_buffersr[i*2 + 1]);
7120 obj_surface = encode_state->reference_objects[i];
7121 avc_state->top_field_poc[2*i] = 0;
7122 avc_state->top_field_poc[2*i+1] = 0;
7124 if (obj_surface && obj_surface->bo) {
7125 i965_object_surface_to_2d_gpe_resource_with_align(&avc_ctx->list_reference_res[i], obj_surface,GPE_RESOURCE_ALIGNMENT);
7127 /* actually it should be handled when it is reconstructed surface */
7128 va_status = gen9_avc_init_check_surfaces(ctx,
7129 obj_surface,encoder_context,
7131 if (va_status != VA_STATUS_SUCCESS)
7133 avc_priv_surface = (struct gen9_surface_avc *)obj_surface->private_data;
7134 i965_dri_object_to_buffer_gpe_resource(&avc_ctx->res_direct_mv_buffersr[i*2],avc_priv_surface->dmv_top);
7135 i965_dri_object_to_buffer_gpe_resource(&avc_ctx->res_direct_mv_buffersr[i*2 + 1],avc_priv_surface->dmv_bottom);
7136 avc_priv_surface->frame_store_id = i;
7137 avc_state->top_field_poc[2*i] = avc_priv_surface->top_field_order_cnt;
7138 avc_state->top_field_poc[2*i+1] = avc_priv_surface->top_field_order_cnt+1;
7145 if (avc_ctx->pres_slice_batch_buffer_2nd_level)
7147 intel_batchbuffer_free(avc_ctx->pres_slice_batch_buffer_2nd_level);
7148 avc_ctx->pres_slice_batch_buffer_2nd_level = NULL;
7151 avc_ctx->pres_slice_batch_buffer_2nd_level =
7152 intel_batchbuffer_new(&i965->intel, I915_EXEC_BSD,
7154 encode_state->num_slice_params_ext);
7155 if (!avc_ctx->pres_slice_batch_buffer_2nd_level)
7156 return VA_STATUS_ERROR_ALLOCATION_FAILED;
7158 for (i = 0;i < MAX_AVC_SLICE_NUM;i++) {
7159 avc_state->slice_batch_offset[i] = 0;
7164 i965_free_gpe_resource(&avc_ctx->res_intra_row_store_scratch_buffer);
7165 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
7166 &avc_ctx->res_intra_row_store_scratch_buffer,
7168 "PAK Intra row store scratch buffer");
7170 goto failed_allocation;
7172 size = w_mb * 4 * 64;
7173 i965_free_gpe_resource(&avc_ctx->res_deblocking_filter_row_store_scratch_buffer);
7174 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
7175 &avc_ctx->res_deblocking_filter_row_store_scratch_buffer,
7177 "PAK Deblocking filter row store scratch buffer");
7179 goto failed_allocation;
7181 size = w_mb * 2 * 64;
7182 i965_free_gpe_resource(&avc_ctx->res_bsd_mpc_row_store_scratch_buffer);
7183 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
7184 &avc_ctx->res_bsd_mpc_row_store_scratch_buffer,
7186 "PAK BSD/MPC row store scratch buffer");
7188 goto failed_allocation;
7190 size = w_mb * h_mb * 16;
7191 i965_free_gpe_resource(&avc_ctx->res_pak_mb_status_buffer);
7192 allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
7193 &avc_ctx->res_pak_mb_status_buffer,
7195 "PAK MB status buffer");
7197 goto failed_allocation;
7199 return VA_STATUS_SUCCESS;
7202 return VA_STATUS_ERROR_ALLOCATION_FAILED;
7206 gen9_avc_encode_picture(VADriverContextP ctx,
7208 struct encode_state *encode_state,
7209 struct intel_encoder_context *encoder_context)
7212 struct i965_driver_data *i965 = i965_driver_data(ctx);
7213 struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
7214 struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context * )vme_context->private_enc_ctx;
7215 struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
7216 struct intel_batchbuffer *batch = encoder_context->base.batch;
7218 va_status = gen9_avc_pak_pipeline_prepare(ctx, encode_state, encoder_context);
7220 if (va_status != VA_STATUS_SUCCESS)
7223 if (i965->intel.has_bsd2)
7224 intel_batchbuffer_start_atomic_bcs_override(batch, 0x1000, BSD_RING0);
7226 intel_batchbuffer_start_atomic_bcs(batch, 0x1000);
7227 intel_batchbuffer_emit_mi_flush(batch);
7229 for (generic_state->curr_pak_pass = 0;
7230 generic_state->curr_pak_pass < generic_state->num_pak_passes;
7231 generic_state->curr_pak_pass++) {
7233 if (generic_state->curr_pak_pass == 0) {
7234 /* Initialize the avc Image Ctrl reg for the first pass,write 0 to staturs/control register, is it needed in AVC? */
7235 struct gpe_mi_load_register_imm_parameter mi_load_reg_imm;
7236 struct encoder_status_buffer_internal *status_buffer;
7238 status_buffer = &(avc_ctx->status_buffer);
7239 memset(&mi_load_reg_imm, 0, sizeof(mi_load_reg_imm));
7240 mi_load_reg_imm.mmio_offset = status_buffer->image_status_ctrl_reg_offset;
7241 mi_load_reg_imm.data = 0;
7242 gen8_gpe_mi_load_register_imm(ctx, batch, &mi_load_reg_imm);
7244 gen9_avc_pak_picture_level(ctx, encode_state, encoder_context);
7245 gen9_avc_pak_slice_level(ctx, encode_state, encoder_context);
7246 gen9_avc_read_mfc_status(ctx, encoder_context);
7250 if (avc_ctx->pres_slice_batch_buffer_2nd_level)
7252 intel_batchbuffer_free(avc_ctx->pres_slice_batch_buffer_2nd_level);
7253 avc_ctx->pres_slice_batch_buffer_2nd_level = NULL;
7256 intel_batchbuffer_end_atomic(batch);
7257 intel_batchbuffer_flush(batch);
7259 generic_state->seq_frame_number++;
7260 generic_state->total_frame_number++;
7261 generic_state->first_frame = 0;
7262 return VA_STATUS_SUCCESS;
7266 gen9_avc_pak_pipeline(VADriverContextP ctx,
7268 struct encode_state *encode_state,
7269 struct intel_encoder_context *encoder_context)
7274 case VAProfileH264ConstrainedBaseline:
7275 case VAProfileH264Main:
7276 case VAProfileH264High:
7277 vaStatus = gen9_avc_encode_picture(ctx, profile, encode_state, encoder_context);
7281 vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
7289 gen9_avc_pak_context_destroy(void * context)
7291 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)context;
7292 struct generic_encoder_context * generic_ctx;
7293 struct i965_avc_encoder_context * avc_ctx;
7299 generic_ctx = (struct generic_encoder_context * )pak_context->generic_enc_ctx;
7300 avc_ctx = (struct i965_avc_encoder_context * )pak_context->private_enc_ctx;
7303 i965_free_gpe_resource(&generic_ctx->res_reconstructed_surface);
7304 i965_free_gpe_resource(&avc_ctx->res_post_deblocking_output);
7305 i965_free_gpe_resource(&avc_ctx->res_pre_deblocking_output);
7306 i965_free_gpe_resource(&generic_ctx->res_uncompressed_input_surface);
7308 i965_free_gpe_resource(&generic_ctx->compressed_bitstream.res);
7309 i965_free_gpe_resource(&avc_ctx->res_intra_row_store_scratch_buffer);
7310 i965_free_gpe_resource(&avc_ctx->res_deblocking_filter_row_store_scratch_buffer);
7311 i965_free_gpe_resource(&avc_ctx->res_bsd_mpc_row_store_scratch_buffer);
7312 i965_free_gpe_resource(&avc_ctx->res_pak_mb_status_buffer);
7314 for(i = 0 ; i < MAX_MFC_AVC_REFERENCE_SURFACES; i++)
7316 i965_free_gpe_resource(&avc_ctx->list_reference_res[i]);
7319 for(i = 0 ; i < NUM_MFC_AVC_DMV_BUFFERS; i++)
7321 i965_free_gpe_resource(&avc_ctx->res_direct_mv_buffersr[i]);
7324 if (avc_ctx->pres_slice_batch_buffer_2nd_level)
7326 intel_batchbuffer_free(avc_ctx->pres_slice_batch_buffer_2nd_level);
7327 avc_ctx->pres_slice_batch_buffer_2nd_level = NULL;
7333 gen9_avc_get_coded_status(VADriverContextP ctx,
7334 struct intel_encoder_context *encoder_context,
7335 struct i965_coded_buffer_segment *coded_buf_seg)
7337 struct encoder_status *avc_encode_status;
7339 if (!encoder_context || !coded_buf_seg)
7340 return VA_STATUS_ERROR_INVALID_BUFFER;
7342 avc_encode_status = (struct encoder_status *)coded_buf_seg->codec_private_data;
7343 coded_buf_seg->base.size = avc_encode_status->bs_byte_count_frame;
7345 return VA_STATUS_SUCCESS;
7349 gen9_avc_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *encoder_context)
7351 /* VME & PAK share the same context */
7352 struct i965_driver_data *i965 = i965_driver_data(ctx);
7353 struct encoder_vme_mfc_context * vme_context = NULL;
7354 struct generic_encoder_context * generic_ctx = NULL;
7355 struct i965_avc_encoder_context * avc_ctx = NULL;
7356 struct generic_enc_codec_state * generic_state = NULL;
7357 struct avc_enc_state * avc_state = NULL;
7358 struct encoder_status_buffer_internal *status_buffer;
7359 uint32_t base_offset = offsetof(struct i965_coded_buffer_segment, codec_private_data);
7361 vme_context = calloc(1, sizeof(struct encoder_vme_mfc_context));
7362 generic_ctx = calloc(1, sizeof(struct generic_encoder_context));
7363 avc_ctx = calloc(1, sizeof(struct i965_avc_encoder_context));
7364 generic_state = calloc(1, sizeof(struct generic_enc_codec_state));
7365 avc_state = calloc(1, sizeof(struct avc_enc_state));
7367 if(!vme_context || !generic_ctx || !avc_ctx || !generic_state || !avc_state)
7368 goto allocate_structure_failed;
7370 memset(vme_context,0,sizeof(struct encoder_vme_mfc_context));
7371 memset(generic_ctx,0,sizeof(struct generic_encoder_context));
7372 memset(avc_ctx,0,sizeof(struct i965_avc_encoder_context));
7373 memset(generic_state,0,sizeof(struct generic_enc_codec_state));
7374 memset(avc_state,0,sizeof(struct avc_enc_state));
7376 encoder_context->vme_context = vme_context;
7377 vme_context->generic_enc_ctx = generic_ctx;
7378 vme_context->private_enc_ctx = avc_ctx;
7379 vme_context->generic_enc_state = generic_state;
7380 vme_context->private_enc_state = avc_state;
7382 if (IS_SKL(i965->intel.device_info)||
7383 IS_BXT(i965->intel.device_info)) {
7384 generic_ctx->enc_kernel_ptr = (void *)skl_avc_encoder_kernels;
7385 generic_ctx->enc_kernel_size = sizeof(skl_avc_encoder_kernels);
7388 goto allocate_structure_failed;
7390 /* initialize misc ? */
7392 generic_ctx->use_hw_scoreboard = 1;
7393 generic_ctx->use_hw_non_stalling_scoreboard = 1;
7395 /* initialize generic state */
7397 generic_state->kernel_mode = INTEL_ENC_KERNEL_NORMAL;
7398 generic_state->preset = INTEL_PRESET_RT_SPEED;
7399 generic_state->seq_frame_number = 0;
7400 generic_state->total_frame_number = 0;
7401 generic_state->frame_type = 0;
7402 generic_state->first_frame = 1;
7404 generic_state->frame_width_in_pixel = 0;
7405 generic_state->frame_height_in_pixel = 0;
7406 generic_state->frame_width_in_mbs = 0;
7407 generic_state->frame_height_in_mbs = 0;
7408 generic_state->frame_width_4x = 0;
7409 generic_state->frame_height_4x = 0;
7410 generic_state->frame_width_16x = 0;
7411 generic_state->frame_height_16x = 0;
7412 generic_state->frame_width_32x = 0;
7413 generic_state->downscaled_width_4x_in_mb = 0;
7414 generic_state->downscaled_height_4x_in_mb = 0;
7415 generic_state->downscaled_width_16x_in_mb = 0;
7416 generic_state->downscaled_height_16x_in_mb = 0;
7417 generic_state->downscaled_width_32x_in_mb = 0;
7418 generic_state->downscaled_height_32x_in_mb = 0;
7420 generic_state->hme_supported = 1;
7421 generic_state->b16xme_supported = 1;
7422 generic_state->b32xme_supported = 0;
7423 generic_state->hme_enabled = 0;
7424 generic_state->b16xme_enabled = 0;
7425 generic_state->b32xme_enabled = 0;
7426 generic_state->brc_distortion_buffer_supported = 1;
7427 generic_state->brc_constant_buffer_supported = 0;
7430 generic_state->frame_rate = 30;
7431 generic_state->brc_allocated = 0;
7432 generic_state->brc_inited = 0;
7433 generic_state->brc_need_reset = 0;
7434 generic_state->is_low_delay = 0;
7435 generic_state->brc_enabled = 0;//default
7436 generic_state->internal_rate_mode = 0;
7437 generic_state->curr_pak_pass = 0;
7438 generic_state->num_pak_passes = MAX_AVC_PAK_PASS_NUM;
7439 generic_state->is_first_pass = 1;
7440 generic_state->is_last_pass = 0;
7441 generic_state->mb_brc_enabled = 0; // enable mb brc
7442 generic_state->brc_roi_enable = 0;
7443 generic_state->brc_dirty_roi_enable = 0;
7444 generic_state->skip_frame_enbale = 0;
7446 generic_state->target_bit_rate = 0;
7447 generic_state->max_bit_rate = 0;
7448 generic_state->min_bit_rate = 0;
7449 generic_state->init_vbv_buffer_fullness_in_bit = 0;
7450 generic_state->vbv_buffer_size_in_bit = 0;
7451 generic_state->frames_per_100s = 0;
7452 generic_state->gop_size = 0;
7453 generic_state->gop_ref_distance = 0;
7454 generic_state->brc_target_size = 0;
7455 generic_state->brc_mode = 0;
7456 generic_state->brc_init_current_target_buf_full_in_bits = 0.0;
7457 generic_state->brc_init_reset_input_bits_per_frame = 0.0;
7458 generic_state->brc_init_reset_buf_size_in_bits = 0;
7459 generic_state->brc_init_previous_target_buf_full_in_bits = 0;
7460 generic_state->frames_per_window_size = 0;//default
7461 generic_state->target_percentage = 0;
7463 generic_state->avbr_curracy = 0;
7464 generic_state->avbr_convergence = 0;
7466 generic_state->num_skip_frames = 0;
7467 generic_state->size_skip_frames = 0;
7469 generic_state->num_roi = 0;
7470 generic_state->max_delta_qp = 0;
7471 generic_state->min_delta_qp = 0;
7473 if (encoder_context->rate_control_mode != VA_RC_NONE &&
7474 encoder_context->rate_control_mode != VA_RC_CQP) {
7475 generic_state->brc_enabled = 1;
7476 generic_state->brc_distortion_buffer_supported = 1;
7477 generic_state->brc_constant_buffer_supported = 1;
7478 generic_state->num_pak_passes = MAX_AVC_PAK_PASS_NUM;
7480 /*avc state initialization */
7481 avc_state->mad_enable = 0;
7482 avc_state->mb_disable_skip_map_enable = 0;
7483 avc_state->sfd_enable = 1;//default
7484 avc_state->sfd_mb_enable = 1;//set it true
7485 avc_state->adaptive_search_window_enable = 1;//default
7486 avc_state->mb_qp_data_enable = 0;
7487 avc_state->intra_refresh_i_enable = 0;
7488 avc_state->min_max_qp_enable = 0;
7489 avc_state->skip_bias_adjustment_enable = 0;//default,same as skip_bias_adjustment_supporte? no
7492 avc_state->non_ftq_skip_threshold_lut_input_enable = 0;
7493 avc_state->ftq_skip_threshold_lut_input_enable = 0;
7494 avc_state->ftq_override = 0;
7496 avc_state->direct_bias_adjustment_enable = 0;
7497 avc_state->global_motion_bias_adjustment_enable = 0;
7498 avc_state->disable_sub_mb_partion = 0;
7499 avc_state->arbitrary_num_mbs_in_slice = 0;
7500 avc_state->adaptive_transform_decision_enable = 0;//default
7501 avc_state->skip_check_disable = 0;
7502 avc_state->tq_enable = 0;
7503 avc_state->enable_avc_ildb = 0;
7504 avc_state->mbaff_flag = 0;
7505 avc_state->enable_force_skip = 1;//default
7506 avc_state->rc_panic_enable = 1;//default
7507 avc_state->suppress_recon_enable = 1;//default
7509 avc_state->ref_pic_select_list_supported = 1;
7510 avc_state->mb_brc_supported = 1;//?,default
7511 avc_state->multi_pre_enable = 1;//default
7512 avc_state->ftq_enable = 1;//default
7513 avc_state->caf_supported = 1; //default
7514 avc_state->caf_enable = 0;
7515 avc_state->caf_disable_hd = 1;//default
7516 avc_state->skip_bias_adjustment_supported = 1;//default
7518 avc_state->adaptive_intra_scaling_enable = 1;//default
7519 avc_state->old_mode_cost_enable = 0;//default
7520 avc_state->multi_ref_qp_enable = 1;//default
7521 avc_state->weighted_ref_l0_enable = 1;//default
7522 avc_state->weighted_ref_l1_enable = 1;//default
7523 avc_state->weighted_prediction_supported = 0;
7524 avc_state->brc_split_enable = 0;
7525 avc_state->slice_level_report_supported = 0;
7527 avc_state->fbr_bypass_enable = 1;//default
7528 avc_state->field_scaling_output_interleaved = 0;
7529 avc_state->mb_variance_output_enable = 0;
7530 avc_state->mb_pixel_average_output_enable = 0;
7531 avc_state->rolling_intra_refresh_enable = 0;// same as intra_refresh_i_enable?
7532 avc_state->mbenc_curbe_set_in_brc_update = 0;
7533 avc_state->rounding_inter_enable = 1; //default
7534 avc_state->adaptive_rounding_inter_enable = 1;//default
7536 avc_state->mbenc_i_frame_dist_in_use = 0;
7537 avc_state->mb_status_supported = 1; //set in intialization for gen9
7538 avc_state->mb_status_enable = 0;
7539 avc_state->mb_vproc_stats_enable = 0;
7540 avc_state->flatness_check_enable = 0;
7541 avc_state->flatness_check_supported = 1;//default
7542 avc_state->block_based_skip_enable = 0;
7543 avc_state->use_widi_mbenc_kernel = 0;
7544 avc_state->kernel_trellis_enable = 0;
7545 avc_state->generic_reserved = 0;
7547 avc_state->rounding_value = 0;
7548 avc_state->rounding_inter_p = 255;//default
7549 avc_state->rounding_inter_b = 255; //default
7550 avc_state->rounding_inter_b_ref = 255; //default
7551 avc_state->min_qp_i = INTEL_AVC_MIN_QP;
7552 avc_state->min_qp_p = INTEL_AVC_MIN_QP;
7553 avc_state->min_qp_b = INTEL_AVC_MIN_QP;
7554 avc_state->max_qp_i = INTEL_AVC_MAX_QP;
7555 avc_state->max_qp_p = INTEL_AVC_MAX_QP;
7556 avc_state->max_qp_b = INTEL_AVC_MAX_QP;
7558 memset(avc_state->non_ftq_skip_threshold_lut,0,52*sizeof(uint8_t));
7559 memset(avc_state->ftq_skip_threshold_lut,0,52*sizeof(uint8_t));
7560 memset(avc_state->lamda_value_lut,0,52*2*sizeof(uint8_t));
7562 avc_state->intra_refresh_qp_threshold = 0;
7563 avc_state->trellis_flag = 0;
7564 avc_state->hme_mv_cost_scaling_factor = 0;
7565 avc_state->slice_height = 1;
7566 avc_state->slice_num = 1;
7567 memset(avc_state->dist_scale_factor_list0,0,32*sizeof(uint32_t));
7568 avc_state->bi_weight = 0;
7569 avc_state->brc_const_data_surface_width = 64;
7570 avc_state->brc_const_data_surface_height = 44;
7572 avc_state->num_refs[0] = 0;
7573 avc_state->num_refs[1] = 0;
7574 memset(avc_state->list_ref_idx,0,32*2*sizeof(uint32_t));
7575 memset(avc_state->top_field_poc,0,NUM_MFC_AVC_DMV_BUFFERS*sizeof(int32_t));
7576 avc_state->tq_rounding = 0;
7577 avc_state->zero_mv_threshold = 0;
7578 avc_state->slice_second_levle_batch_buffer_in_use = 0;
7582 /* the definition of status buffer offset for Encoder */
7584 status_buffer = &avc_ctx->status_buffer;
7585 memset(status_buffer, 0,sizeof(struct encoder_status_buffer_internal));
7587 status_buffer->base_offset = base_offset;
7588 status_buffer->bs_byte_count_frame_offset = base_offset + offsetof(struct encoder_status, bs_byte_count_frame);
7589 status_buffer->bs_byte_count_frame_nh_offset = base_offset + offsetof(struct encoder_status, bs_byte_count_frame_nh);
7590 status_buffer->image_status_mask_offset = base_offset + offsetof(struct encoder_status, image_status_mask);
7591 status_buffer->image_status_ctrl_offset = base_offset + offsetof(struct encoder_status, image_status_ctrl);
7592 status_buffer->mfc_qp_status_count_offset = base_offset + offsetof(struct encoder_status, mfc_qp_status_count);
7593 status_buffer->media_index_offset = base_offset + offsetof(struct encoder_status, media_index);
7595 status_buffer->status_buffer_size = sizeof(struct encoder_status);
7596 status_buffer->bs_byte_count_frame_reg_offset = MFC_BITSTREAM_BYTECOUNT_FRAME_REG;
7597 status_buffer->bs_byte_count_frame_nh_reg_offset = MFC_BITSTREAM_BYTECOUNT_SLICE_REG;
7598 status_buffer->image_status_mask_reg_offset = MFC_IMAGE_STATUS_MASK_REG;
7599 status_buffer->image_status_ctrl_reg_offset = MFC_IMAGE_STATUS_CTRL_REG;
7600 status_buffer->mfc_qp_status_count_reg_offset = MFC_QP_STATUS_COUNT_REG;
7602 gen9_avc_kernel_init(ctx,encoder_context);
7603 encoder_context->vme_context = vme_context;
7604 encoder_context->vme_pipeline = gen9_avc_vme_pipeline;
7605 encoder_context->vme_context_destroy = gen9_avc_vme_context_destroy;
7609 allocate_structure_failed:
7614 free(generic_state);
7620 gen9_avc_pak_context_init(VADriverContextP ctx, struct intel_encoder_context *encoder_context)
7622 /* VME & PAK share the same context */
7623 struct encoder_vme_mfc_context * pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
7628 encoder_context->mfc_context = pak_context;
7629 encoder_context->mfc_context_destroy = gen9_avc_pak_context_destroy;
7630 encoder_context->mfc_pipeline = gen9_avc_pak_pipeline;
7631 encoder_context->mfc_brc_prepare = gen9_avc_pak_brc_prepare;
7632 encoder_context->get_status = gen9_avc_get_coded_status;