1 /**************************************************************************
3 * Copyright 2014 Advanced Micro Devices, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
28 #include "va_private.h"
30 void vlVaHandlePictureParameterBufferHEVC(vlVaDriver
*drv
, vlVaContext
*context
, vlVaBuffer
*buf
)
32 VAPictureParameterBufferHEVC
*hevc
= buf
->data
;
35 assert(buf
->size
>= sizeof(VAPictureParameterBufferHEVC
) && buf
->num_elements
== 1);
36 context
->desc
.h265
.pps
->sps
->chroma_format_idc
= hevc
->pic_fields
.bits
.chroma_format_idc
;
37 context
->desc
.h265
.pps
->sps
->separate_colour_plane_flag
=
38 hevc
->pic_fields
.bits
.separate_colour_plane_flag
;
39 context
->desc
.h265
.pps
->sps
->pic_width_in_luma_samples
= hevc
->pic_width_in_luma_samples
;
40 context
->desc
.h265
.pps
->sps
->pic_height_in_luma_samples
= hevc
->pic_height_in_luma_samples
;
41 context
->desc
.h265
.pps
->sps
->bit_depth_luma_minus8
= hevc
->bit_depth_luma_minus8
;
42 context
->desc
.h265
.pps
->sps
->bit_depth_chroma_minus8
= hevc
->bit_depth_chroma_minus8
;
43 context
->desc
.h265
.pps
->sps
->log2_max_pic_order_cnt_lsb_minus4
=
44 hevc
->log2_max_pic_order_cnt_lsb_minus4
;
45 context
->desc
.h265
.pps
->sps
->sps_max_dec_pic_buffering_minus1
=
46 hevc
->sps_max_dec_pic_buffering_minus1
;
47 context
->desc
.h265
.pps
->sps
->log2_min_luma_coding_block_size_minus3
=
48 hevc
->log2_min_luma_coding_block_size_minus3
;
49 context
->desc
.h265
.pps
->sps
->log2_diff_max_min_luma_coding_block_size
=
50 hevc
->log2_diff_max_min_luma_coding_block_size
;
51 context
->desc
.h265
.pps
->sps
->log2_min_transform_block_size_minus2
=
52 hevc
->log2_min_transform_block_size_minus2
;
53 context
->desc
.h265
.pps
->sps
->log2_diff_max_min_transform_block_size
=
54 hevc
->log2_diff_max_min_transform_block_size
;
55 context
->desc
.h265
.pps
->sps
->max_transform_hierarchy_depth_inter
=
56 hevc
->max_transform_hierarchy_depth_inter
;
57 context
->desc
.h265
.pps
->sps
->max_transform_hierarchy_depth_intra
=
58 hevc
->max_transform_hierarchy_depth_intra
;
59 context
->desc
.h265
.pps
->sps
->scaling_list_enabled_flag
=
60 hevc
->pic_fields
.bits
.scaling_list_enabled_flag
;
61 context
->desc
.h265
.pps
->sps
->amp_enabled_flag
= hevc
->pic_fields
.bits
.amp_enabled_flag
;
62 context
->desc
.h265
.pps
->sps
->sample_adaptive_offset_enabled_flag
=
63 hevc
->slice_parsing_fields
.bits
.sample_adaptive_offset_enabled_flag
;
64 context
->desc
.h265
.pps
->sps
->pcm_enabled_flag
= hevc
->pic_fields
.bits
.pcm_enabled_flag
;
65 if (hevc
->pic_fields
.bits
.pcm_enabled_flag
== 1) {
66 context
->desc
.h265
.pps
->sps
->pcm_sample_bit_depth_luma_minus1
=
67 hevc
->pcm_sample_bit_depth_luma_minus1
;
68 context
->desc
.h265
.pps
->sps
->pcm_sample_bit_depth_chroma_minus1
=
69 hevc
->pcm_sample_bit_depth_chroma_minus1
;
70 context
->desc
.h265
.pps
->sps
->log2_min_pcm_luma_coding_block_size_minus3
=
71 hevc
->log2_min_pcm_luma_coding_block_size_minus3
;
72 context
->desc
.h265
.pps
->sps
->log2_diff_max_min_pcm_luma_coding_block_size
=
73 hevc
->log2_diff_max_min_pcm_luma_coding_block_size
;
74 context
->desc
.h265
.pps
->sps
->pcm_loop_filter_disabled_flag
=
75 hevc
->pic_fields
.bits
.pcm_loop_filter_disabled_flag
;
77 context
->desc
.h265
.pps
->sps
->num_short_term_ref_pic_sets
= hevc
->num_short_term_ref_pic_sets
;
78 context
->desc
.h265
.pps
->sps
->long_term_ref_pics_present_flag
=
79 hevc
->slice_parsing_fields
.bits
.long_term_ref_pics_present_flag
;
80 context
->desc
.h265
.pps
->sps
->num_long_term_ref_pics_sps
= hevc
->num_long_term_ref_pic_sps
;
81 context
->desc
.h265
.pps
->sps
->sps_temporal_mvp_enabled_flag
=
82 hevc
->slice_parsing_fields
.bits
.sps_temporal_mvp_enabled_flag
;
83 context
->desc
.h265
.pps
->sps
->strong_intra_smoothing_enabled_flag
=
84 hevc
->pic_fields
.bits
.strong_intra_smoothing_enabled_flag
;
86 context
->desc
.h265
.pps
->dependent_slice_segments_enabled_flag
=
87 hevc
->slice_parsing_fields
.bits
.dependent_slice_segments_enabled_flag
;
88 context
->desc
.h265
.pps
->output_flag_present_flag
=
89 hevc
->slice_parsing_fields
.bits
.output_flag_present_flag
;
90 context
->desc
.h265
.pps
->num_extra_slice_header_bits
= hevc
->num_extra_slice_header_bits
;
91 context
->desc
.h265
.pps
->sign_data_hiding_enabled_flag
=
92 hevc
->pic_fields
.bits
.sign_data_hiding_enabled_flag
;
93 context
->desc
.h265
.pps
->cabac_init_present_flag
=
94 hevc
->slice_parsing_fields
.bits
.cabac_init_present_flag
;
95 context
->desc
.h265
.pps
->num_ref_idx_l0_default_active_minus1
=
96 hevc
->num_ref_idx_l0_default_active_minus1
;
97 context
->desc
.h265
.pps
->num_ref_idx_l1_default_active_minus1
=
98 hevc
->num_ref_idx_l1_default_active_minus1
;
99 context
->desc
.h265
.pps
->init_qp_minus26
= hevc
->init_qp_minus26
;
100 context
->desc
.h265
.pps
->constrained_intra_pred_flag
=
101 hevc
->pic_fields
.bits
.constrained_intra_pred_flag
;
102 context
->desc
.h265
.pps
->transform_skip_enabled_flag
=
103 hevc
->pic_fields
.bits
.transform_skip_enabled_flag
;
104 context
->desc
.h265
.pps
->cu_qp_delta_enabled_flag
=
105 hevc
->pic_fields
.bits
.cu_qp_delta_enabled_flag
;
106 context
->desc
.h265
.pps
->diff_cu_qp_delta_depth
= hevc
->diff_cu_qp_delta_depth
;
107 context
->desc
.h265
.pps
->pps_cb_qp_offset
= hevc
->pps_cb_qp_offset
;
108 context
->desc
.h265
.pps
->pps_cr_qp_offset
= hevc
->pps_cr_qp_offset
;
109 context
->desc
.h265
.pps
->pps_slice_chroma_qp_offsets_present_flag
=
110 hevc
->slice_parsing_fields
.bits
.pps_slice_chroma_qp_offsets_present_flag
;
111 context
->desc
.h265
.pps
->weighted_pred_flag
= hevc
->pic_fields
.bits
.weighted_pred_flag
;
112 context
->desc
.h265
.pps
->weighted_bipred_flag
= hevc
->pic_fields
.bits
.weighted_bipred_flag
;
113 context
->desc
.h265
.pps
->transquant_bypass_enabled_flag
=
114 hevc
->pic_fields
.bits
.transquant_bypass_enabled_flag
;
115 context
->desc
.h265
.pps
->tiles_enabled_flag
= hevc
->pic_fields
.bits
.tiles_enabled_flag
;
116 context
->desc
.h265
.pps
->entropy_coding_sync_enabled_flag
=
117 hevc
->pic_fields
.bits
.entropy_coding_sync_enabled_flag
;
118 if (hevc
->pic_fields
.bits
.tiles_enabled_flag
== 1) {
119 context
->desc
.h265
.pps
->num_tile_columns_minus1
= hevc
->num_tile_columns_minus1
;
120 context
->desc
.h265
.pps
->num_tile_rows_minus1
= hevc
->num_tile_rows_minus1
;
121 for (i
= 0 ; i
< 19 ; i
++)
122 context
->desc
.h265
.pps
->column_width_minus1
[i
] = hevc
->column_width_minus1
[i
];
123 for (i
= 0 ; i
< 21 ; i
++)
124 context
->desc
.h265
.pps
->row_height_minus1
[i
] = hevc
->row_height_minus1
[i
];
125 context
->desc
.h265
.pps
->loop_filter_across_tiles_enabled_flag
=
126 hevc
->pic_fields
.bits
.loop_filter_across_tiles_enabled_flag
;
128 context
->desc
.h265
.pps
->pps_loop_filter_across_slices_enabled_flag
=
129 hevc
->pic_fields
.bits
.pps_loop_filter_across_slices_enabled_flag
;
130 context
->desc
.h265
.pps
->deblocking_filter_override_enabled_flag
=
131 hevc
->slice_parsing_fields
.bits
.deblocking_filter_override_enabled_flag
;
132 context
->desc
.h265
.pps
->pps_deblocking_filter_disabled_flag
=
133 hevc
->slice_parsing_fields
.bits
.pps_disable_deblocking_filter_flag
;
134 context
->desc
.h265
.pps
->pps_beta_offset_div2
= hevc
->pps_beta_offset_div2
;
135 context
->desc
.h265
.pps
->pps_tc_offset_div2
= hevc
->pps_tc_offset_div2
;
136 context
->desc
.h265
.pps
->lists_modification_present_flag
=
137 hevc
->slice_parsing_fields
.bits
.lists_modification_present_flag
;
138 context
->desc
.h265
.pps
->log2_parallel_merge_level_minus2
=
139 hevc
->log2_parallel_merge_level_minus2
;
140 context
->desc
.h265
.pps
->slice_segment_header_extension_present_flag
=
141 hevc
->slice_parsing_fields
.bits
.slice_segment_header_extension_present_flag
;
143 context
->desc
.h265
.IDRPicFlag
= hevc
->slice_parsing_fields
.bits
.IdrPicFlag
;
144 context
->desc
.h265
.RAPPicFlag
= hevc
->slice_parsing_fields
.bits
.RapPicFlag
;
146 context
->desc
.h265
.CurrPicOrderCntVal
= hevc
->CurrPic
.pic_order_cnt
;
148 for (i
= 0 ; i
< 8 ; i
++) {
149 context
->desc
.h265
.RefPicSetStCurrBefore
[i
] = 0xFF;
150 context
->desc
.h265
.RefPicSetStCurrAfter
[i
] = 0xFF;
151 context
->desc
.h265
.RefPicSetLtCurr
[i
] = 0xFF;
153 context
->desc
.h265
.NumPocStCurrBefore
= 0;
154 context
->desc
.h265
.NumPocStCurrAfter
= 0;
155 context
->desc
.h265
.NumPocLtCurr
= 0;
156 unsigned int iBefore
= 0;
157 unsigned int iAfter
= 0;
158 unsigned int iCurr
= 0;
159 for (i
= 0 ; i
< 15 ; i
++) {
160 context
->desc
.h265
.PicOrderCntVal
[i
] = hevc
->ReferenceFrames
[i
].pic_order_cnt
;
162 vlVaGetReferenceFrame(drv
, hevc
->ReferenceFrames
[i
].picture_id
, &context
->desc
.h265
.ref
[i
]);
164 if ((hevc
->ReferenceFrames
[i
].flags
& VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE
) && (iBefore
< 8)) {
165 context
->desc
.h265
.RefPicSetStCurrBefore
[iBefore
++] = i
;
166 context
->desc
.h265
.NumPocStCurrBefore
++;
168 if ((hevc
->ReferenceFrames
[i
].flags
& VA_PICTURE_HEVC_RPS_ST_CURR_AFTER
) && (iAfter
< 8)) {
169 context
->desc
.h265
.RefPicSetStCurrAfter
[iAfter
++] = i
;
170 context
->desc
.h265
.NumPocStCurrAfter
++;
172 if ((hevc
->ReferenceFrames
[i
].flags
& VA_PICTURE_HEVC_RPS_LT_CURR
) && (iCurr
< 8)) {
173 context
->desc
.h265
.RefPicSetLtCurr
[iCurr
++] = i
;
174 context
->desc
.h265
.NumPocLtCurr
++;
179 void vlVaHandleIQMatrixBufferHEVC(vlVaContext
*context
, vlVaBuffer
*buf
)
181 VAIQMatrixBufferHEVC
*h265
= buf
->data
;
183 assert(buf
->size
>= sizeof(VAIQMatrixBufferH264
) && buf
->num_elements
== 1);
184 memcpy(&context
->desc
.h265
.pps
->sps
->ScalingList4x4
, h265
->ScalingList4x4
, 6 * 16);
185 memcpy(&context
->desc
.h265
.pps
->sps
->ScalingList8x8
, h265
->ScalingList8x8
, 6 * 64);
186 memcpy(&context
->desc
.h265
.pps
->sps
->ScalingList16x16
, h265
->ScalingList16x16
, 6 * 64);
187 memcpy(&context
->desc
.h265
.pps
->sps
->ScalingList32x32
, h265
->ScalingList32x32
, 2 * 64);
188 memcpy(&context
->desc
.h265
.pps
->sps
->ScalingListDCCoeff16x16
, h265
->ScalingListDC16x16
, 6);
189 memcpy(&context
->desc
.h265
.pps
->sps
->ScalingListDCCoeff32x32
, h265
->ScalingListDC32x32
, 2);
192 void vlVaHandleSliceParameterBufferHEVC(vlVaContext
*context
, vlVaBuffer
*buf
)
194 VASliceParameterBufferHEVC
*h265
= buf
->data
;
196 assert(buf
->size
>= sizeof(VASliceParameterBufferHEVC
) && buf
->num_elements
== 1);
197 for (int i
= 0 ; i
< 2 ; i
++) {
198 for (int j
= 0 ; j
< 15 ; j
++)
199 context
->desc
.h265
.RefPicList
[i
][j
] = h265
->RefPicList
[i
][j
];
201 context
->desc
.h265
.UseRefPicList
= true;