[Libva] [PATCH v1 7/9] ENC: add VME pipeline for AVC encoder
Qu, Pengfei
pengfei.qu at intel.com
Thu Jan 19 07:17:43 UTC 2017
-----Original Message-----
From: Mark Thompson [mailto:sw at jkqxz.net]
Sent: Thursday, January 19, 2017 7:25 AM
To: libva at lists.freedesktop.org; Qu, Pengfei <pengfei.qu at intel.com>
Subject: Re: [Libva] [PATCH v1 7/9] ENC: add VME pipeline for AVC encoder
On 13/01/17 09:24, Pengfei Qu wrote:
> VME pipeline:
> add resource and surface allocation and free function add init table
> for frame mbbrc update add scaling kernel for AVC encoder add BRC init
> reset kernel for AVC RC logic add BRC frame update-kernel for AVC RC
> logic add BRC MB level update kernel for AVC RC logic add REF frame QA
> caculation and MB level const data add MBENC kernel for AVC encoder
> add ME kernel for AVC encoder add WP/SFD kernel for AVC encoder add
> kernel init/destroy function for AVC encoder add kernel related
> parameter check function for AVC add VME pipeline init prepare/run
> function for AVC encoder
>
> Reviewed-by: Sean V Kelley<seanvk at posteo.de>
> Signed-off-by: Pengfei Qu <Pengfei.Qu at intel.com>
> ---
> src/gen9_avc_encoder.c | 5745
> ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 5745 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 0000000..5caa9f4
> --- /dev/null
> +++ b/src/gen9_avc_encoder.c
> ...
> +
> +static void
> +gen9_avc_update_misc_parameters(VADriverContextP ctx,
> + struct encode_state *encode_state,
> + struct intel_encoder_context
> +*encoder_context) {
> + 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;
> +
> + /* brc */
> + generic_state->max_bit_rate = ALIGN(encoder_context->brc.bits_per_second[0], 1000) / 1000;
> + generic_state->window_size = encoder_context->brc.window_size;
> + generic_state->brc_need_reset = encoder_context->brc.need_reset;
> +
> + if (generic_state->internal_rate_mode == VA_RC_CBR) {
> + generic_state->min_bit_rate = generic_state->max_bit_rate;
> + generic_state->mb_brc_enabled =
> + encoder_context->brc.mb_rate_control[0];
> +
> + 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 == VA_RC_VBR) {
> + generic_state->min_bit_rate = generic_state->max_bit_rate * (2 * encoder_context->brc.target_percentage[0] - 100) / 100;
> + generic_state->mb_brc_enabled =
> + encoder_context->brc.mb_rate_control[0];
> +
> + if (generic_state->target_bit_rate != generic_state->max_bit_rate * encoder_context->brc.target_percentage[0] / 100) {
> + generic_state->target_bit_rate = generic_state->max_bit_rate * encoder_context->brc.target_percentage[0] / 100;
> + generic_state->brc_need_reset = 1;
> + }
> + }
> +
> + /* frame rate */
> + generic_state->frames_per_100s =
> + encoder_context->brc.framerate[0].num/encoder_context->brc.framerate
> + [0].den * 100;
The framerate need not be set in CQP mode - this crashes with a division by zero in that case.
[Pengfei] sure. I will add check here to fix it.
Also, it discards the fractional part of the framerate by rounding down before multiplying by 100 - is that deliberate?
[Pengfei] I check the RC algorithm interface, it use 100x to do calculation.
> + generic_state->frame_rate =
> + encoder_context->brc.framerate[0].num/encoder_context->brc.framerate
> + [0].den ;
> +
> + /* HRD */
> + if (generic_state->internal_rate_mode != VA_RC_CQP)
> + {
> + generic_state->vbv_buffer_size_in_bit = encoder_context->brc.hrd_buffer_size;//misc->buffer_size;
> + generic_state->init_vbv_buffer_fullness_in_bit = encoder_context->brc.hrd_initial_buffer_fullness;//misc->initial_buffer_fullness;
> + }
> +
> + /* ROI */
> + generic_state->num_roi = MIN(encoder_context->brc.num_roi, 3);
> + if (generic_state->num_roi > 0) {
> + generic_state->max_delta_qp = encoder_context->brc.roi_max_delta_qp;
> + generic_state->min_delta_qp =
> + encoder_context->brc.roi_min_delta_qp;
> +
> + for (i = 0; i < generic_state->num_roi; i++) {
> + generic_state->roi[i].left = encoder_context->brc.roi[i].left;
> + generic_state->roi[i].right = encoder_context->brc.roi[i].right;
> + generic_state->roi[i].top = encoder_context->brc.roi[i].top;
> + generic_state->roi[i].bottom = encoder_context->brc.roi[i].bottom;
> + generic_state->roi[i].value =
> + encoder_context->brc.roi[i].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;
> + }
> + }
> +
> +}
> +
More information about the Libva
mailing list