Path: blob/21.2-virgl/src/gallium/frontends/va/picture_vp9.c
4561 views
/**************************************************************************1*2* Copyright 2018 Advanced Micro Devices, Inc.3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice (including the14* next paragraph) shall be included in all copies or substantial portions15* of the Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS18* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.20* IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR21* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,22* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE23* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.24*25**************************************************************************/2627#include "vl/vl_vlc.h"28#include "va_private.h"2930#define NUM_VP9_REFS 83132void vlVaHandlePictureParameterBufferVP9(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)33{34VADecPictureParameterBufferVP9 *vp9 = buf->data;35int i;3637assert(buf->size >= sizeof(VADecPictureParameterBufferVP9) && buf->num_elements == 1);3839context->desc.vp9.picture_parameter.frame_width = vp9->frame_width;40context->desc.vp9.picture_parameter.frame_height = vp9->frame_height;4142context->desc.vp9.picture_parameter.pic_fields.subsampling_x = vp9->pic_fields.bits.subsampling_x;43context->desc.vp9.picture_parameter.pic_fields.subsampling_y = vp9->pic_fields.bits.subsampling_y;44context->desc.vp9.picture_parameter.pic_fields.frame_type = vp9->pic_fields.bits.frame_type;45context->desc.vp9.picture_parameter.pic_fields.show_frame = vp9->pic_fields.bits.show_frame;46context->desc.vp9.picture_parameter.pic_fields.error_resilient_mode = vp9->pic_fields.bits.error_resilient_mode;47context->desc.vp9.picture_parameter.pic_fields.intra_only = vp9->pic_fields.bits.intra_only;48context->desc.vp9.picture_parameter.pic_fields.allow_high_precision_mv = vp9->pic_fields.bits.allow_high_precision_mv;49context->desc.vp9.picture_parameter.pic_fields.mcomp_filter_type = vp9->pic_fields.bits.mcomp_filter_type;50context->desc.vp9.picture_parameter.pic_fields.frame_parallel_decoding_mode = vp9->pic_fields.bits.frame_parallel_decoding_mode;51context->desc.vp9.picture_parameter.pic_fields.reset_frame_context = vp9->pic_fields.bits.reset_frame_context;52context->desc.vp9.picture_parameter.pic_fields.refresh_frame_context = vp9->pic_fields.bits.refresh_frame_context;53context->desc.vp9.picture_parameter.pic_fields.frame_context_idx = vp9->pic_fields.bits.frame_context_idx;54context->desc.vp9.picture_parameter.pic_fields.segmentation_enabled = vp9->pic_fields.bits.segmentation_enabled;55context->desc.vp9.picture_parameter.pic_fields.segmentation_temporal_update = vp9->pic_fields.bits.segmentation_temporal_update;56context->desc.vp9.picture_parameter.pic_fields.segmentation_update_map = vp9->pic_fields.bits.segmentation_update_map;57context->desc.vp9.picture_parameter.pic_fields.last_ref_frame = vp9->pic_fields.bits.last_ref_frame;58context->desc.vp9.picture_parameter.pic_fields.last_ref_frame_sign_bias = vp9->pic_fields.bits.last_ref_frame_sign_bias;59context->desc.vp9.picture_parameter.pic_fields.golden_ref_frame = vp9->pic_fields.bits.golden_ref_frame;60context->desc.vp9.picture_parameter.pic_fields.golden_ref_frame_sign_bias = vp9->pic_fields.bits.golden_ref_frame_sign_bias;61context->desc.vp9.picture_parameter.pic_fields.alt_ref_frame = vp9->pic_fields.bits.alt_ref_frame;62context->desc.vp9.picture_parameter.pic_fields.alt_ref_frame_sign_bias = vp9->pic_fields.bits.alt_ref_frame_sign_bias;63context->desc.vp9.picture_parameter.pic_fields.lossless_flag = vp9->pic_fields.bits.lossless_flag;6465context->desc.vp9.picture_parameter.filter_level = vp9->filter_level;66context->desc.vp9.picture_parameter.sharpness_level = vp9->sharpness_level;6768context->desc.vp9.picture_parameter.log2_tile_rows = vp9->log2_tile_rows;69context->desc.vp9.picture_parameter.log2_tile_columns = vp9->log2_tile_columns;7071context->desc.vp9.picture_parameter.frame_header_length_in_bytes = vp9->frame_header_length_in_bytes;72context->desc.vp9.picture_parameter.first_partition_size = vp9->first_partition_size;7374for (i = 0; i < 7; ++i)75context->desc.vp9.picture_parameter.mb_segment_tree_probs[i] = vp9->mb_segment_tree_probs[i];76for (i = 0; i < 3; ++i)77context->desc.vp9.picture_parameter.segment_pred_probs[i] = vp9->segment_pred_probs[i];7879context->desc.vp9.picture_parameter.profile = vp9->profile;8081context->desc.vp9.picture_parameter.bit_depth = vp9->bit_depth;8283for (i = 0 ; i < NUM_VP9_REFS ; i++) {84if (vp9->pic_fields.bits.frame_type == 0)85context->desc.vp9.ref[i] = NULL;86else87vlVaGetReferenceFrame(drv, vp9->reference_frames[i], &context->desc.vp9.ref[i]);88}8990if (!context->decoder && !context->templat.max_references)91context->templat.max_references = NUM_VP9_REFS;92}9394void vlVaHandleSliceParameterBufferVP9(vlVaContext *context, vlVaBuffer *buf)95{96VASliceParameterBufferVP9 *vp9 = buf->data;97int i;9899assert(buf->size >= sizeof(VASliceParameterBufferVP9) && buf->num_elements == 1);100101context->desc.vp9.slice_parameter.slice_data_size = vp9->slice_data_size;102context->desc.vp9.slice_parameter.slice_data_offset = vp9->slice_data_offset;103context->desc.vp9.slice_parameter.slice_data_flag = vp9->slice_data_flag;104105for (i = 0; i < 8; ++i) {106context->desc.vp9.slice_parameter.seg_param[i].segment_flags.segment_reference_enabled =107vp9->seg_param[i].segment_flags.fields.segment_reference_enabled;108context->desc.vp9.slice_parameter.seg_param[i].segment_flags.segment_reference =109vp9->seg_param[i].segment_flags.fields.segment_reference;110context->desc.vp9.slice_parameter.seg_param[i].segment_flags.segment_reference_skipped =111vp9->seg_param[i].segment_flags.fields.segment_reference_skipped;112113memcpy(context->desc.vp9.slice_parameter.seg_param[i].filter_level, vp9->seg_param[i].filter_level, 4 * 2);114115context->desc.vp9.slice_parameter.seg_param[i].luma_ac_quant_scale = vp9->seg_param[i].luma_ac_quant_scale;116context->desc.vp9.slice_parameter.seg_param[i].luma_dc_quant_scale = vp9->seg_param[i].luma_dc_quant_scale;117context->desc.vp9.slice_parameter.seg_param[i].chroma_ac_quant_scale = vp9->seg_param[i].chroma_ac_quant_scale;118context->desc.vp9.slice_parameter.seg_param[i].chroma_dc_quant_scale = vp9->seg_param[i].chroma_dc_quant_scale;119}120}121122static unsigned vp9_u(struct vl_vlc *vlc, unsigned n)123{124unsigned valid = vl_vlc_valid_bits(vlc);125126if (n == 0)127return 0;128129if (valid < 32)130vl_vlc_fillbits(vlc);131132return vl_vlc_get_uimsbf(vlc, n);133}134135static signed vp9_s(struct vl_vlc *vlc, unsigned n)136{137unsigned v;138bool s;139140v = vp9_u(vlc, n);141s = vp9_u(vlc, 1);142143return s ? -v : v;144}145146static void bitdepth_colorspace_sampling(struct vl_vlc *vlc, unsigned profile)147{148unsigned cs;149150if (profile == 2)151/* bit_depth */152vp9_u(vlc, 1);153154cs = vp9_u(vlc, 3);155if (cs != 7)156/* yuv_range_flag */157vp9_u(vlc, 1);158}159160static void frame_size(struct vl_vlc *vlc)161{162/* width_minus_one */163vp9_u(vlc, 16);164/* height_minus_one */165vp9_u(vlc, 16);166167/* has_scaling */168if (vp9_u(vlc, 1)) {169/* render_width_minus_one */170vp9_u(vlc, 16);171/* render_height_minus_one */172vp9_u(vlc, 16);173}174}175176void vlVaDecoderVP9BitstreamHeader(vlVaContext *context, vlVaBuffer *buf)177{178struct vl_vlc vlc;179unsigned profile;180bool frame_type, show_frame, error_resilient_mode;181bool mode_ref_delta_enabled, mode_ref_delta_update = false;182int i;183184vl_vlc_init(&vlc, 1, (const void * const*)&buf->data,185(const unsigned *)&context->desc.vp9.picture_parameter.frame_header_length_in_bytes);186187/* frame_marker */188if (vp9_u(&vlc, 2) != 0x2)189return;190191profile = vp9_u(&vlc, 1) | vp9_u(&vlc, 1) << 1;192193if (profile == 3)194profile += vp9_u(&vlc, 1);195196if (profile != 0 && profile != 2)197return;198199/* show_existing_frame */200if (vp9_u(&vlc, 1))201return;202203frame_type = vp9_u(&vlc, 1);204show_frame = vp9_u(&vlc, 1);205error_resilient_mode = vp9_u(&vlc, 1);206207if (frame_type == 0) {208/* sync_code */209if (vp9_u(&vlc, 24) != 0x498342)210return;211212bitdepth_colorspace_sampling(&vlc, profile);213frame_size(&vlc);214} else {215bool intra_only, size_in_refs = false;216217intra_only = show_frame ? 0 : vp9_u(&vlc, 1);218if (!error_resilient_mode)219/* reset_frame_context */220vp9_u(&vlc, 2);221222if (intra_only) {223/* sync_code */224if (vp9_u(&vlc, 24) != 0x498342)225return;226227bitdepth_colorspace_sampling(&vlc, profile);228/* refresh_frame_flags */229vp9_u(&vlc, 8);230frame_size(&vlc);231} else {232/* refresh_frame_flags */233vp9_u(&vlc, 8);234235for (i = 0; i < 3; ++i) {236/* frame refs */237vp9_u(&vlc, 3);238vp9_u(&vlc, 1);239}240241for (i = 0; i < 3; ++i) {242size_in_refs = vp9_u(&vlc, 1);243if (size_in_refs)244break;245}246247if (!size_in_refs) {248/* width/height_minus_one */249vp9_u(&vlc, 16);250vp9_u(&vlc, 16);251}252253if (vp9_u(&vlc, 1)) {254/* render_width/height_minus_one */255vp9_u(&vlc, 16);256vp9_u(&vlc, 16);257}258259/* high_precision_mv */260vp9_u(&vlc, 1);261/* filter_switchable */262if (!vp9_u(&vlc, 1))263/* filter_index */264vp9_u(&vlc, 2);265}266}267if (!error_resilient_mode) {268/* refresh_frame_context */269vp9_u(&vlc, 1);270/* frame_parallel_decoding_mode */271vp9_u(&vlc, 1);272}273/* frame_context_index */274vp9_u(&vlc, 2);275276/* loop filter */277278/* filter_level */279vp9_u(&vlc, 6);280/* sharpness_level */281vp9_u(&vlc, 3);282283mode_ref_delta_enabled = vp9_u(&vlc, 1);284if (mode_ref_delta_enabled) {285mode_ref_delta_update = vp9_u(&vlc, 1);286if (mode_ref_delta_update) {287for (i = 0; i < 4; ++i) {288/* update_ref_delta */289if (vp9_u(&vlc, 1))290/* ref_deltas */291vp9_s(&vlc, 6);292}293for (i = 0; i < 2; ++i) {294/* update_mode_delta */295if (vp9_u(&vlc, 1))296/* mode_deltas */297vp9_s(&vlc, 6);298}299}300}301context->desc.vp9.picture_parameter.mode_ref_delta_enabled = mode_ref_delta_enabled;302context->desc.vp9.picture_parameter.mode_ref_delta_update = mode_ref_delta_update;303304/* quantization */305306context->desc.vp9.picture_parameter.base_qindex = vp9_u(&vlc, 8);307context->desc.vp9.picture_parameter.y_dc_delta_q = vp9_u(&vlc, 1) ? vp9_s(&vlc, 4) : 0;308context->desc.vp9.picture_parameter.uv_ac_delta_q = vp9_u(&vlc, 1) ? vp9_s(&vlc, 4) : 0;309context->desc.vp9.picture_parameter.uv_dc_delta_q = vp9_u(&vlc, 1) ? vp9_s(&vlc, 4) : 0;310311/* segmentation */312313/* enabled */314if (!vp9_u(&vlc, 1))315return;316317/* update_map */318if (vp9_u(&vlc, 1)) {319for (i = 0; i < 7; ++i) {320/* tree_probs_set */321if (vp9_u(&vlc, 1)) {322/* tree_probs */323vp9_u(&vlc, 8);324}325}326327/* temporal_update */328if (vp9_u(&vlc, 1)) {329for (i = 0; i < 3; ++i) {330/* pred_probs_set */331if (vp9_u(&vlc, 1))332/* pred_probs */333vp9_u(&vlc, 8);334}335}336}337338/* update_data */339if (vp9_u(&vlc, 1)) {340/* abs_delta */341context->desc.vp9.picture_parameter.abs_delta = vp9_u(&vlc, 1);342for (i = 0; i < 8; ++i) {343/* Use alternate quantizer */344if ((context->desc.vp9.slice_parameter.seg_param[i].alt_quant_enabled = vp9_u(&vlc, 1)))345context->desc.vp9.slice_parameter.seg_param[i].alt_quant = vp9_s(&vlc, 8);346/* Use alternate loop filter value */347if ((context->desc.vp9.slice_parameter.seg_param[i].alt_lf_enabled = vp9_u(&vlc, 1)))348context->desc.vp9.slice_parameter.seg_param[i].alt_lf = vp9_s(&vlc, 6);349/* Optional Segment reference frame */350if (vp9_u(&vlc, 1))351vp9_u(&vlc, 2);352/* Optional Segment skip mode */353vp9_u(&vlc, 1);354}355}356}357358359