[Libva] [PATCH 08/31] ENC: add misc parameter check for AVC encoder

Qu, Pengfei pengfei.qu at intel.com
Thu Jan 12 02:34:26 UTC 2017


-----Original Message-----
From: Libva [mailto:libva-bounces at lists.freedesktop.org] On Behalf Of Zhao Yakui
Sent: Wednesday, January 11, 2017 11:13 AM
To: Sean V Kelley <seanvk at posteo.de>
Cc: libva at lists.freedesktop.org
Subject: Re: [Libva] [PATCH 08/31] ENC: add misc parameter check for AVC encoder

On 01/11/2017 07:37 AM, Sean V Kelley wrote:
> From: Pengfei Qu<Pengfei.Qu at intel.com>
>
> Signed-off-by: Pengfei Qu<Pengfei.Qu at intel.com>
> Reviewed-by: Sean V Kelley<seanvk at posteo.de>
> ---
>   src/gen9_avc_encoder.c | 548 +++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 548 insertions(+)
>   create mode 100755 src/gen9_avc_encoder.c
>
> diff --git a/src/gen9_avc_encoder.c b/src/gen9_avc_encoder.c new file 
> mode 100755 index 00000000..8f1ad79f
> --- /dev/null
> +++ b/src/gen9_avc_encoder.c
> @@ -0,0 +1,548 @@
> +/*
> + * Copyright ? 2016 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person 
> +obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, 
> +including
> + * without limitation the rights to use, copy, modify, merge, 
> +publish,
> + * distribute, sub license, and/or sell copies of the Software, and 
> +to
> + * permit persons to whom the Software is furnished to do so, subject 
> +to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including 
> +the
> + * next paragraph) shall be included in all copies or substantial 
> +portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
> +EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> + * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE 
> +FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
> +CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWAR
> + *
> + * Authors:
> + *    Pengfei Qu<Pengfei.qu at intel.com>
> + *
> + */
> +
> +#include<stdio.h>
> +#include<stdlib.h>
> +#include<stdbool.h>
> +#include<string.h>
> +#include<math.h>
> +#include<assert.h>
> +#include<va/va.h>
> +
> +#include "intel_batchbuffer.h"
> +#include "intel_driver.h"
> +
> +#include "i965_defines.h"
> +#include "i965_structs.h"
> +#include "i965_drv_video.h"
> +#include "i965_encoder.h"
> +#include "i965_encoder_utils.h"
> +#include "intel_media.h"
> +
> +#include "i965_gpe_utils.h"
> +#include "i965_encoder_common.h"
> +#include "i965_avc_encoder_common.h"
> +#include "gen9_avc_encoder_kernels.h"
> +#include "gen9_avc_encoder.h"
> +#include "gen9_avc_const_def.h"
> +
> +#define MAX_URB_SIZE                    4096 /* In register */
> +#define NUM_KERNELS_PER_GPE_CONTEXT     1
> +#define MBENC_KERNEL_BASE GEN9_AVC_KERNEL_MBENC_QUALITY_I
> +

Please use the OUT_BCS_RELOC64 instead of OUT_BCS_RELOC so that it can work for 48-bit GPU address.
[Pengfei] Good comments. It will be modified.

> +#define OUT_BUFFER_2DW(batch, bo, is_target, delta)  do {               \
> +        if (bo) {                                                       \
> +            OUT_BCS_RELOC(batch,                                        \
> +                            bo,                                         \
> +                            I915_GEM_DOMAIN_INSTRUCTION,                \
> +                            is_target ? I915_GEM_DOMAIN_INSTRUCTION : 0,     \
> +                            delta);                                     \
> +            OUT_BCS_BATCH(batch, 0);                                    \
> +        } else {                                                        \
> +            OUT_BCS_BATCH(batch, 0);                                    \
> +            OUT_BCS_BATCH(batch, 0);                                    \
> +        }                                                               \
> +    } while (0)
> +
> +#define OUT_BUFFER_3DW(batch, bo, is_target, delta, attr)  do { \
> +        OUT_BUFFER_2DW(batch, bo, is_target, delta);            \
> +        OUT_BCS_BATCH(batch, attr);                             \
> +    } while (0)
> +
> +
> +static const uint32_t qm_flat[16] = {
> +    0x10101010, 0x10101010, 0x10101010, 0x10101010,
> +    0x10101010, 0x10101010, 0x10101010, 0x10101010,
> +    0x10101010, 0x10101010, 0x10101010, 0x10101010,
> +    0x10101010, 0x10101010, 0x10101010, 0x10101010 };
> +
> +static const uint32_t fqm_flat[32] = {
> +    0x10001000, 0x10001000, 0x10001000, 0x10001000,
> +    0x10001000, 0x10001000, 0x10001000, 0x10001000,
> +    0x10001000, 0x10001000, 0x10001000, 0x10001000,
> +    0x10001000, 0x10001000, 0x10001000, 0x10001000,
> +    0x10001000, 0x10001000, 0x10001000, 0x10001000,
> +    0x10001000, 0x10001000, 0x10001000, 0x10001000,
> +    0x10001000, 0x10001000, 0x10001000, 0x10001000,
> +    0x10001000, 0x10001000, 0x10001000, 0x10001000 };
> +
> +static unsigned int slice_type_kernel[3] = {1,2,0};
> +
> +const gen9_avc_brc_init_reset_curbe_data 
> +gen9_avc_brc_init_reset_curbe_init_data = {
> +    // unsigned int 0
> +    {
> +            0
> +    },
> +
> +    // unsigned int 1
> +    {
> +            0
> +    },
> +
> +    // unsigned int 2
> +    {
> +            0
> +    },
> +
> +    // unsigned int 3
> +    {
> +            0
> +    },
> +
> +    // unsigned int 4
> +    {
> +            0
> +    },
> +
> +    // unsigned int 5
> +    {
> +            0
> +    },
> +
> +    // unsigned int 6
> +    {
> +            0
> +    },
> +
> +    // unsigned int 7
> +    {
> +            0
> +    },
> +
> +    // unsigned int 8
> +    {
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 9
> +    {
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 10
> +    {
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 11
> +    {
> +            0,
> +            1
> +    },
> +
> +    // unsigned int 12
> +    {
> +            51,
> +            0
> +    },
> +
> +    // unsigned int 13
> +    {
> +            40,
> +            60,
> +            80,
> +            120
> +    },
> +
> +    // unsigned int 14
> +    {
> +            35,
> +            60,
> +            80,
> +            120
> +    },
> +
> +    // unsigned int 15
> +    {
> +            40,
> +            60,
> +            90,
> +            115
> +    },
> +
> +    // unsigned int 16
> +    {
> +            0,
> +            0,
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 17
> +    {
> +            0,
> +            0,
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 18
> +    {
> +            0,
> +            0,
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 19
> +    {
> +            0,
> +            0,
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 20
> +    {
> +            0,
> +            0,
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 21
> +    {
> +            0,
> +            0,
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 22
> +    {
> +            0,
> +            0,
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 23
> +    {
> +            0
> +    }
> +};
> +
> +const gen9_avc_frame_brc_update_curbe_data 
> +gen9_avc_frame_brc_update_curbe_init_data = {
> +    // unsigned int 0
> +    {
> +            0
> +    },
> +
> +    // unsigned int 1
> +    {
> +            0
> +    },
> +
> +    // unsigned int 2
> +    {
> +            0
> +    },
> +
> +    // unsigned int 3
> +    {
> +            10,
> +            50
> +    },
> +
> +    // unsigned int 4
> +    {
> +            100,
> +            150
> +    },
> +
> +    // unsigned int 5
> +    {
> +            0,
> +            0,
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 6
> +    {
> +            0,
> +            0,
> +            0,
> +            0,
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 7
> +    {
> +            0
> +    },
> +
> +    // unsigned int 8
> +    {
> +            1,
> +            1,
> +            3,
> +            2
> +    },
> +
> +    // unsigned int 9
> +    {
> +            1,
> +            40,
> +            5,
> +            5
> +    },
> +
> +    // unsigned int 10
> +    {
> +            3,
> +            1,
> +            7,
> +            18
> +    },
> +
> +    // unsigned int 11
> +    {
> +            25,
> +            37,
> +            40,
> +            75
> +    },
> +
> +    // unsigned int 12
> +    {
> +            97,
> +            103,
> +            125,
> +            160
> +    },
> +
> +    // unsigned int 13
> +    {
> +            -3,
> +            -2,
> +            -1,
> +            0
> +    },
> +
> +    // unsigned int 14
> +    {
> +            1,
> +            2,
> +            3,
> +            0xff
> +    },
> +
> +    // unsigned int 15
> +    {
> +            0,
> +            0,
> +            0,
> +            0
> +    },
> +
> +    // unsigned int 16
> +    {
> +            0
> +    },
> +
> +    // unsigned int 17
> +    {
> +            0
> +    },
> +
> +    // unsigned int 18
> +    {
> +            0
> +    },
> +
> +    // unsigned int 19
> +    {
> +            0
> +    },
> +
> +    // unsigned int 20
> +    {
> +            0
> +    },
> +
> +    // unsigned int 21
> +    {
> +            0
> +    },
> +
> +    // unsigned int 22
> +    {
> +            0
> +    },
> +
> +    // unsigned int 23
> +    {
> +            0
> +    },
> +
> +};
> +

The below function or similar definition is already defined in i965_encoder_context structure of i965_encoder.c


Can we use them instead of new implementation?
[Pengfei] It will be modified in the new implementation.

> +static void
> +gen9_avc_update_rate_control_parameters(VADriverContextP ctx,
> +                                        struct intel_encoder_context *encoder_context,
> +                                        VAEncMiscParameterRateControl 
> +*misc) {
> +    struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
> +    struct generic_enc_codec_state * generic_state = (struct 
> +generic_enc_codec_state * )vme_context->generic_enc_state;
> +
> +    generic_state->max_bit_rate = ALIGN(misc->bits_per_second, 1000) / 1000;
> +    generic_state->window_size = misc->window_size;
> +
> +    if (generic_state->internal_rate_mode == INTEL_BRC_CBR) {
> +        generic_state->min_bit_rate = generic_state->max_bit_rate;
> +        generic_state->mb_brc_enabled = 
> + misc->rc_flags.bits.mb_rate_control;
> +
> +        if (generic_state->target_bit_rate != generic_state->max_bit_rate) {
> +            generic_state->target_bit_rate = generic_state->max_bit_rate;
> +            generic_state->brc_need_reset = 1;
> +        }
> +    } else if (generic_state->internal_rate_mode == INTEL_BRC_VBR) {
> +        generic_state->min_bit_rate = generic_state->max_bit_rate * (2 * misc->target_percentage - 100) / 100;
> +        generic_state->mb_brc_enabled = 
> + misc->rc_flags.bits.mb_rate_control;
> +
> +        if (generic_state->target_bit_rate != generic_state->max_bit_rate * misc->target_percentage / 100) {
> +            generic_state->target_bit_rate = generic_state->max_bit_rate * misc->target_percentage / 100;
> +            generic_state->brc_need_reset = 1;
> +        }
> +    }
> +}
> +
> +static void
> +gen9_avc_update_hrd_parameters(VADriverContextP ctx,
> +                               struct intel_encoder_context *encoder_context,
> +                               VAEncMiscParameterHRD *misc) {
> +    struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
> +    struct generic_enc_codec_state * generic_state = (struct 
> +generic_enc_codec_state * )vme_context->generic_enc_state;
> +
> +    if (generic_state->internal_rate_mode == INTEL_BRC_CQP)
> +        return;
> +
> +    generic_state->vbv_buffer_size_in_bit = misc->buffer_size;
> +    generic_state->init_vbv_buffer_fullness_in_bit = 
> +misc->initial_buffer_fullness; }
> +
> +static void
> +gen9_avc_update_framerate_parameters(VADriverContextP ctx,
> +                                     struct intel_encoder_context *encoder_context,
> +                                     VAEncMiscParameterFrameRate 
> +*misc) {
> +    struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
> +    struct generic_enc_codec_state * generic_state = (struct 
> +generic_enc_codec_state * )vme_context->generic_enc_state;
> +
> +    generic_state->frames_per_100s = misc->framerate * 100; /* misc->framerate is multiple of 100 */
> +    generic_state->frame_rate = misc->framerate ; }
> +
> +static void
> +gen9_avc_update_roi_parameters(VADriverContextP ctx,
> +                               struct intel_encoder_context *encoder_context,
> +                               VAEncMiscParameterBufferROI *misc) {
> +    struct encoder_vme_mfc_context * vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
> +    struct generic_enc_codec_state * generic_state = (struct generic_enc_codec_state * )vme_context->generic_enc_state;
> +    int i;
> +
> +    if (!misc || !misc->roi) {
> +        generic_state->num_roi = 0;
> +        return;
> +    }
> +
> +    generic_state->num_roi = MIN(misc->num_roi, 3);
> +    generic_state->max_delta_qp = misc->max_delta_qp;
> +    generic_state->min_delta_qp = misc->min_delta_qp;
> +
> +    for (i = 0; i<  generic_state->num_roi; i++) {
> +        generic_state->roi[i].left = misc->roi->roi_rectangle.x;
> +        generic_state->roi[i].right = generic_state->roi[i].left + misc->roi->roi_rectangle.width;
> +        generic_state->roi[i].top = misc->roi->roi_rectangle.y;
> +        generic_state->roi[i].bottom = generic_state->roi[i].top + misc->roi->roi_rectangle.height;
> +        generic_state->roi[i].value = misc->roi->roi_value;
> +
> +        generic_state->roi[i].left /= 16;
> +        generic_state->roi[i].right /= 16;
> +        generic_state->roi[i].top /= 16;
> +        generic_state->roi[i].bottom /= 16;
> +    }
> +}
> +
> +static void
> +gen9_avc_update_misc_parameters(VADriverContextP ctx,
> +                                struct encode_state *encode_state,
> +                                struct intel_encoder_context 
> +*encoder_context) {
> +    int i,j;
> +    VAEncMiscParameterBuffer *misc_param;
> +
> +    for (i = 0; i<  ARRAY_ELEMS(encode_state->misc_param); i++) {
> +        for (j = 0; j<  ARRAY_ELEMS(encode_state->misc_param[0]); j++) {
> +            if (!encode_state->misc_param[i][j] || !encode_state->misc_param[i][j]->buffer)
> +                continue;
> +
> +            misc_param = (VAEncMiscParameterBuffer 
> + *)encode_state->misc_param[i][0]->buffer;
> +
> +            switch (misc_param->type) {
> +            case VAEncMiscParameterTypeFrameRate:
> +                gen9_avc_update_framerate_parameters(ctx,
> +                                                     encoder_context,
> +                                                     (VAEncMiscParameterFrameRate *)misc_param->data);
> +                break;
> +
> +            case VAEncMiscParameterTypeRateControl:
> +                gen9_avc_update_rate_control_parameters(ctx,
> +                                                        encoder_context,
> +                                                        (VAEncMiscParameterRateControl *)misc_param->data);
> +                break;
> +
> +            case VAEncMiscParameterTypeHRD:
> +                gen9_avc_update_hrd_parameters(ctx,
> +                                               encoder_context,
> +                                               (VAEncMiscParameterHRD *)misc_param->data);
> +                break;
> +
> +            case VAEncMiscParameterTypeROI:
> +                gen9_avc_update_roi_parameters(ctx,
> +                                               encoder_context,
> +                                               (VAEncMiscParameterBufferROI *)misc_param->data);
> +                break;
> +
> +            default:
> +                break;
> +            }
> +        }
> +    }
> +}

_______________________________________________
Libva mailing list
Libva at lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libva


More information about the Libva mailing list