1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2021 Red Hat
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include "vk_video.h"
25*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
26*61046927SAndroid Build Coastguard Worker #include "vk_log.h"
27*61046927SAndroid Build Coastguard Worker #include "vk_alloc.h"
28*61046927SAndroid Build Coastguard Worker #include "vk_device.h"
29*61046927SAndroid Build Coastguard Worker #include "util/vl_rbsp.h"
30*61046927SAndroid Build Coastguard Worker #include "util/vl_bitstream.h"
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker VkResult
vk_video_session_init(struct vk_device * device,struct vk_video_session * vid,const VkVideoSessionCreateInfoKHR * create_info)33*61046927SAndroid Build Coastguard Worker vk_video_session_init(struct vk_device *device,
34*61046927SAndroid Build Coastguard Worker struct vk_video_session *vid,
35*61046927SAndroid Build Coastguard Worker const VkVideoSessionCreateInfoKHR *create_info)
36*61046927SAndroid Build Coastguard Worker {
37*61046927SAndroid Build Coastguard Worker vk_object_base_init(device, &vid->base, VK_OBJECT_TYPE_VIDEO_SESSION_KHR);
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker vid->flags = create_info->flags;
40*61046927SAndroid Build Coastguard Worker vid->op = create_info->pVideoProfile->videoCodecOperation;
41*61046927SAndroid Build Coastguard Worker vid->max_coded = create_info->maxCodedExtent;
42*61046927SAndroid Build Coastguard Worker vid->picture_format = create_info->pictureFormat;
43*61046927SAndroid Build Coastguard Worker vid->ref_format = create_info->referencePictureFormat;
44*61046927SAndroid Build Coastguard Worker vid->max_dpb_slots = create_info->maxDpbSlots;
45*61046927SAndroid Build Coastguard Worker vid->max_active_ref_pics = create_info->maxActiveReferencePictures;
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker switch (vid->op) {
48*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: {
49*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH264ProfileInfoKHR *h264_profile =
50*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pVideoProfile->pNext,
51*61046927SAndroid Build Coastguard Worker VIDEO_DECODE_H264_PROFILE_INFO_KHR);
52*61046927SAndroid Build Coastguard Worker vid->h264.profile_idc = h264_profile->stdProfileIdc;
53*61046927SAndroid Build Coastguard Worker break;
54*61046927SAndroid Build Coastguard Worker }
55*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: {
56*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265ProfileInfoKHR *h265_profile =
57*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pVideoProfile->pNext,
58*61046927SAndroid Build Coastguard Worker VIDEO_DECODE_H265_PROFILE_INFO_KHR);
59*61046927SAndroid Build Coastguard Worker vid->h265.profile_idc = h265_profile->stdProfileIdc;
60*61046927SAndroid Build Coastguard Worker break;
61*61046927SAndroid Build Coastguard Worker }
62*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR: {
63*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeAV1ProfileInfoKHR *av1_profile =
64*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pVideoProfile->pNext,
65*61046927SAndroid Build Coastguard Worker VIDEO_DECODE_AV1_PROFILE_INFO_KHR);
66*61046927SAndroid Build Coastguard Worker vid->av1.profile = av1_profile->stdProfile;
67*61046927SAndroid Build Coastguard Worker vid->av1.film_grain_support = av1_profile->filmGrainSupport;
68*61046927SAndroid Build Coastguard Worker break;
69*61046927SAndroid Build Coastguard Worker };
70*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: {
71*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH264ProfileInfoKHR *h264_profile =
72*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pVideoProfile->pNext, VIDEO_ENCODE_H264_PROFILE_INFO_KHR);
73*61046927SAndroid Build Coastguard Worker vid->h264.profile_idc = h264_profile->stdProfileIdc;
74*61046927SAndroid Build Coastguard Worker break;
75*61046927SAndroid Build Coastguard Worker }
76*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: {
77*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH265ProfileInfoKHR *h265_profile =
78*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pVideoProfile->pNext, VIDEO_ENCODE_H265_PROFILE_INFO_KHR);
79*61046927SAndroid Build Coastguard Worker vid->h265.profile_idc = h265_profile->stdProfileIdc;
80*61046927SAndroid Build Coastguard Worker break;
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker default:
83*61046927SAndroid Build Coastguard Worker return VK_ERROR_FEATURE_NOT_PRESENT;
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker if (vid->op == VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR ||
87*61046927SAndroid Build Coastguard Worker vid->op == VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR) {
88*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeUsageInfoKHR *encode_usage_profile =
89*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pVideoProfile->pNext, VIDEO_ENCODE_USAGE_INFO_KHR);
90*61046927SAndroid Build Coastguard Worker if (encode_usage_profile) {
91*61046927SAndroid Build Coastguard Worker vid->enc_usage.video_usage_hints = encode_usage_profile->videoUsageHints;
92*61046927SAndroid Build Coastguard Worker vid->enc_usage.video_content_hints = encode_usage_profile->videoContentHints;
93*61046927SAndroid Build Coastguard Worker vid->enc_usage.tuning_mode = encode_usage_profile->tuningMode;
94*61046927SAndroid Build Coastguard Worker } else {
95*61046927SAndroid Build Coastguard Worker vid->enc_usage.video_usage_hints = VK_VIDEO_ENCODE_USAGE_DEFAULT_KHR;
96*61046927SAndroid Build Coastguard Worker vid->enc_usage.video_content_hints = VK_VIDEO_ENCODE_CONTENT_DEFAULT_KHR;
97*61046927SAndroid Build Coastguard Worker vid->enc_usage.tuning_mode = VK_VIDEO_ENCODE_TUNING_MODE_DEFAULT_KHR;
98*61046927SAndroid Build Coastguard Worker }
99*61046927SAndroid Build Coastguard Worker }
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
102*61046927SAndroid Build Coastguard Worker }
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker static void
vk_video_deep_copy_h264_sps(struct vk_video_h264_sps * dst,const StdVideoH264SequenceParameterSet * src)105*61046927SAndroid Build Coastguard Worker vk_video_deep_copy_h264_sps(struct vk_video_h264_sps *dst,
106*61046927SAndroid Build Coastguard Worker const StdVideoH264SequenceParameterSet *src)
107*61046927SAndroid Build Coastguard Worker {
108*61046927SAndroid Build Coastguard Worker memcpy(&dst->base, src, sizeof(StdVideoH264SequenceParameterSet));
109*61046927SAndroid Build Coastguard Worker if (src->num_ref_frames_in_pic_order_cnt_cycle && src->pOffsetForRefFrame) {
110*61046927SAndroid Build Coastguard Worker memcpy(dst->offsets_for_ref_frame, src->pOffsetForRefFrame, sizeof(int32_t) * src->num_ref_frames_in_pic_order_cnt_cycle);
111*61046927SAndroid Build Coastguard Worker dst->base.pOffsetForRefFrame = dst->offsets_for_ref_frame;
112*61046927SAndroid Build Coastguard Worker }
113*61046927SAndroid Build Coastguard Worker if (src->flags.seq_scaling_matrix_present_flag && src->pScalingLists) {
114*61046927SAndroid Build Coastguard Worker memcpy(&dst->scaling_lists, src->pScalingLists, sizeof(StdVideoH264ScalingLists));
115*61046927SAndroid Build Coastguard Worker dst->base.pScalingLists = &dst->scaling_lists;
116*61046927SAndroid Build Coastguard Worker }
117*61046927SAndroid Build Coastguard Worker if (src->flags.vui_parameters_present_flag && src->pSequenceParameterSetVui) {
118*61046927SAndroid Build Coastguard Worker memcpy(&dst->vui, src->pSequenceParameterSetVui, sizeof(StdVideoH264SequenceParameterSetVui));
119*61046927SAndroid Build Coastguard Worker dst->base.pSequenceParameterSetVui = &dst->vui;
120*61046927SAndroid Build Coastguard Worker
121*61046927SAndroid Build Coastguard Worker if (src->pSequenceParameterSetVui->pHrdParameters) {
122*61046927SAndroid Build Coastguard Worker memcpy(&dst->vui_hrd_parameters, src->pSequenceParameterSetVui->pHrdParameters,
123*61046927SAndroid Build Coastguard Worker sizeof(StdVideoH264HrdParameters));
124*61046927SAndroid Build Coastguard Worker dst->vui.pHrdParameters = &dst->vui_hrd_parameters;
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker }
127*61046927SAndroid Build Coastguard Worker }
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker static void
vk_video_deep_copy_h264_pps(struct vk_video_h264_pps * dst,const StdVideoH264PictureParameterSet * src)130*61046927SAndroid Build Coastguard Worker vk_video_deep_copy_h264_pps(struct vk_video_h264_pps *dst,
131*61046927SAndroid Build Coastguard Worker const StdVideoH264PictureParameterSet *src)
132*61046927SAndroid Build Coastguard Worker {
133*61046927SAndroid Build Coastguard Worker memcpy(&dst->base, src, sizeof(StdVideoH264PictureParameterSet));
134*61046927SAndroid Build Coastguard Worker if (src->flags.pic_scaling_matrix_present_flag && src->pScalingLists) {
135*61046927SAndroid Build Coastguard Worker memcpy(&dst->scaling_lists, src->pScalingLists, sizeof(StdVideoH264ScalingLists));
136*61046927SAndroid Build Coastguard Worker dst->base.pScalingLists = &dst->scaling_lists;
137*61046927SAndroid Build Coastguard Worker }
138*61046927SAndroid Build Coastguard Worker }
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard Worker static void
vk_video_deep_copy_h265_vps(struct vk_video_h265_vps * dst,const StdVideoH265VideoParameterSet * src)141*61046927SAndroid Build Coastguard Worker vk_video_deep_copy_h265_vps(struct vk_video_h265_vps *dst,
142*61046927SAndroid Build Coastguard Worker const StdVideoH265VideoParameterSet *src)
143*61046927SAndroid Build Coastguard Worker {
144*61046927SAndroid Build Coastguard Worker memcpy(&dst->base, src, sizeof(StdVideoH265VideoParameterSet));
145*61046927SAndroid Build Coastguard Worker if (src->pDecPicBufMgr) {
146*61046927SAndroid Build Coastguard Worker memcpy(&dst->dec_pic_buf_mgr, src->pDecPicBufMgr, sizeof(StdVideoH265DecPicBufMgr));
147*61046927SAndroid Build Coastguard Worker dst->base.pDecPicBufMgr = &dst->dec_pic_buf_mgr;
148*61046927SAndroid Build Coastguard Worker }
149*61046927SAndroid Build Coastguard Worker if (src->pHrdParameters) {
150*61046927SAndroid Build Coastguard Worker memcpy(&dst->hrd_parameters, src->pHrdParameters, sizeof(StdVideoH265HrdParameters));
151*61046927SAndroid Build Coastguard Worker dst->base.pHrdParameters = &dst->hrd_parameters;
152*61046927SAndroid Build Coastguard Worker if (src->pHrdParameters->pSubLayerHrdParametersNal) {
153*61046927SAndroid Build Coastguard Worker memcpy(&dst->hrd_parameters_nal, src->pHrdParameters->pSubLayerHrdParametersNal,
154*61046927SAndroid Build Coastguard Worker sizeof(StdVideoH265SubLayerHrdParameters));
155*61046927SAndroid Build Coastguard Worker dst->hrd_parameters.pSubLayerHrdParametersNal = &dst->hrd_parameters_nal;
156*61046927SAndroid Build Coastguard Worker }
157*61046927SAndroid Build Coastguard Worker if (src->pHrdParameters->pSubLayerHrdParametersVcl) {
158*61046927SAndroid Build Coastguard Worker memcpy(&dst->hrd_parameters_vcl, src->pHrdParameters->pSubLayerHrdParametersVcl,
159*61046927SAndroid Build Coastguard Worker sizeof(StdVideoH265SubLayerHrdParameters));
160*61046927SAndroid Build Coastguard Worker dst->hrd_parameters.pSubLayerHrdParametersVcl = &dst->hrd_parameters_vcl;
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker }
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker if (src->pProfileTierLevel) {
165*61046927SAndroid Build Coastguard Worker memcpy(&dst->tier_level, src->pProfileTierLevel, sizeof(StdVideoH265ProfileTierLevel));
166*61046927SAndroid Build Coastguard Worker dst->base.pProfileTierLevel = &dst->tier_level;
167*61046927SAndroid Build Coastguard Worker }
168*61046927SAndroid Build Coastguard Worker }
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker static void
vk_video_deep_copy_h265_sps(struct vk_video_h265_sps * dst,const StdVideoH265SequenceParameterSet * src)171*61046927SAndroid Build Coastguard Worker vk_video_deep_copy_h265_sps(struct vk_video_h265_sps *dst,
172*61046927SAndroid Build Coastguard Worker const StdVideoH265SequenceParameterSet *src)
173*61046927SAndroid Build Coastguard Worker {
174*61046927SAndroid Build Coastguard Worker memcpy(&dst->base, src, sizeof(StdVideoH265SequenceParameterSet));
175*61046927SAndroid Build Coastguard Worker if (src->pProfileTierLevel) {
176*61046927SAndroid Build Coastguard Worker memcpy(&dst->tier_level, src->pProfileTierLevel, sizeof(StdVideoH265ProfileTierLevel));
177*61046927SAndroid Build Coastguard Worker dst->base.pProfileTierLevel = &dst->tier_level;
178*61046927SAndroid Build Coastguard Worker }
179*61046927SAndroid Build Coastguard Worker if (src->pDecPicBufMgr) {
180*61046927SAndroid Build Coastguard Worker memcpy(&dst->dec_pic_buf_mgr, src->pDecPicBufMgr, sizeof(StdVideoH265DecPicBufMgr));
181*61046927SAndroid Build Coastguard Worker dst->base.pDecPicBufMgr = &dst->dec_pic_buf_mgr;
182*61046927SAndroid Build Coastguard Worker }
183*61046927SAndroid Build Coastguard Worker if (src->flags.sps_scaling_list_data_present_flag && src->pScalingLists) {
184*61046927SAndroid Build Coastguard Worker memcpy(&dst->scaling_lists, src->pScalingLists, sizeof(StdVideoH265ScalingLists));
185*61046927SAndroid Build Coastguard Worker dst->base.pScalingLists = &dst->scaling_lists;
186*61046927SAndroid Build Coastguard Worker }
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker if (src->pShortTermRefPicSet) {
189*61046927SAndroid Build Coastguard Worker memcpy(&dst->short_term_ref_pic_set, src->pShortTermRefPicSet, sizeof(StdVideoH265ShortTermRefPicSet));
190*61046927SAndroid Build Coastguard Worker dst->base.pShortTermRefPicSet = &dst->short_term_ref_pic_set;
191*61046927SAndroid Build Coastguard Worker }
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker if (src->pLongTermRefPicsSps) {
194*61046927SAndroid Build Coastguard Worker memcpy(&dst->long_term_ref_pics_sps, src->pLongTermRefPicsSps, sizeof(StdVideoH265LongTermRefPicsSps));
195*61046927SAndroid Build Coastguard Worker dst->base.pLongTermRefPicsSps = &dst->long_term_ref_pics_sps;
196*61046927SAndroid Build Coastguard Worker }
197*61046927SAndroid Build Coastguard Worker
198*61046927SAndroid Build Coastguard Worker if (src->pSequenceParameterSetVui) {
199*61046927SAndroid Build Coastguard Worker memcpy(&dst->vui, src->pSequenceParameterSetVui, sizeof(StdVideoH265SequenceParameterSetVui));
200*61046927SAndroid Build Coastguard Worker dst->base.pSequenceParameterSetVui = &dst->vui;
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker if (src->pSequenceParameterSetVui->pHrdParameters) {
203*61046927SAndroid Build Coastguard Worker memcpy(&dst->hrd_parameters, src->pSequenceParameterSetVui->pHrdParameters, sizeof(StdVideoH265HrdParameters));
204*61046927SAndroid Build Coastguard Worker dst->vui.pHrdParameters = &dst->hrd_parameters;
205*61046927SAndroid Build Coastguard Worker if (src->pSequenceParameterSetVui->pHrdParameters->pSubLayerHrdParametersNal) {
206*61046927SAndroid Build Coastguard Worker memcpy(&dst->hrd_parameters_nal, src->pSequenceParameterSetVui->pHrdParameters->pSubLayerHrdParametersNal,
207*61046927SAndroid Build Coastguard Worker sizeof(StdVideoH265SubLayerHrdParameters));
208*61046927SAndroid Build Coastguard Worker dst->hrd_parameters.pSubLayerHrdParametersNal = &dst->hrd_parameters_nal;
209*61046927SAndroid Build Coastguard Worker }
210*61046927SAndroid Build Coastguard Worker if (src->pSequenceParameterSetVui->pHrdParameters->pSubLayerHrdParametersVcl) {
211*61046927SAndroid Build Coastguard Worker memcpy(&dst->hrd_parameters_vcl, src->pSequenceParameterSetVui->pHrdParameters->pSubLayerHrdParametersVcl,
212*61046927SAndroid Build Coastguard Worker sizeof(StdVideoH265SubLayerHrdParameters));
213*61046927SAndroid Build Coastguard Worker dst->hrd_parameters.pSubLayerHrdParametersVcl = &dst->hrd_parameters_vcl;
214*61046927SAndroid Build Coastguard Worker }
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker }
217*61046927SAndroid Build Coastguard Worker if (src->flags.sps_palette_predictor_initializers_present_flag && src->pPredictorPaletteEntries) {
218*61046927SAndroid Build Coastguard Worker memcpy(&dst->palette_entries, src->pPredictorPaletteEntries, sizeof(StdVideoH265PredictorPaletteEntries));
219*61046927SAndroid Build Coastguard Worker dst->base.pPredictorPaletteEntries = &dst->palette_entries;
220*61046927SAndroid Build Coastguard Worker }
221*61046927SAndroid Build Coastguard Worker }
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Worker static void
vk_video_deep_copy_h265_pps(struct vk_video_h265_pps * dst,const StdVideoH265PictureParameterSet * src)224*61046927SAndroid Build Coastguard Worker vk_video_deep_copy_h265_pps(struct vk_video_h265_pps *dst,
225*61046927SAndroid Build Coastguard Worker const StdVideoH265PictureParameterSet *src)
226*61046927SAndroid Build Coastguard Worker {
227*61046927SAndroid Build Coastguard Worker memcpy(&dst->base, src, sizeof(StdVideoH265PictureParameterSet));
228*61046927SAndroid Build Coastguard Worker if (src->flags.pps_scaling_list_data_present_flag && src->pScalingLists) {
229*61046927SAndroid Build Coastguard Worker memcpy(&dst->scaling_lists, src->pScalingLists, sizeof(StdVideoH265ScalingLists));
230*61046927SAndroid Build Coastguard Worker dst->base.pScalingLists = &dst->scaling_lists;
231*61046927SAndroid Build Coastguard Worker }
232*61046927SAndroid Build Coastguard Worker
233*61046927SAndroid Build Coastguard Worker if (src->flags.pps_palette_predictor_initializers_present_flag && src->pPredictorPaletteEntries) {
234*61046927SAndroid Build Coastguard Worker memcpy(&dst->palette_entries, src->pPredictorPaletteEntries, sizeof(StdVideoH265PredictorPaletteEntries));
235*61046927SAndroid Build Coastguard Worker dst->base.pPredictorPaletteEntries = &dst->palette_entries;
236*61046927SAndroid Build Coastguard Worker }
237*61046927SAndroid Build Coastguard Worker }
238*61046927SAndroid Build Coastguard Worker
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker #define FIND(PARAMSET, SS, SET, ID) \
241*61046927SAndroid Build Coastguard Worker static struct vk_video_##SET *find_##SS##_##SET(const struct vk_video_session_parameters *params, uint32_t id) { \
242*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < params->SS.SET##_count; i++) { \
243*61046927SAndroid Build Coastguard Worker if (params->SS.SET[i].base.ID == id) \
244*61046927SAndroid Build Coastguard Worker return ¶ms->SS.SET[i]; \
245*61046927SAndroid Build Coastguard Worker } \
246*61046927SAndroid Build Coastguard Worker return NULL; \
247*61046927SAndroid Build Coastguard Worker } \
248*61046927SAndroid Build Coastguard Worker \
249*61046927SAndroid Build Coastguard Worker static void add_##SS##_##SET(struct vk_video_session_parameters *params, \
250*61046927SAndroid Build Coastguard Worker const PARAMSET *new_set, bool noreplace) { \
251*61046927SAndroid Build Coastguard Worker struct vk_video_##SET *set = find_##SS##_##SET(params, new_set->ID); \
252*61046927SAndroid Build Coastguard Worker if (set) { \
253*61046927SAndroid Build Coastguard Worker if (noreplace) \
254*61046927SAndroid Build Coastguard Worker return; \
255*61046927SAndroid Build Coastguard Worker vk_video_deep_copy_##SET(set, new_set); \
256*61046927SAndroid Build Coastguard Worker } else \
257*61046927SAndroid Build Coastguard Worker vk_video_deep_copy_##SET(¶ms->SS.SET[params->SS.SET##_count++], new_set); \
258*61046927SAndroid Build Coastguard Worker } \
259*61046927SAndroid Build Coastguard Worker \
260*61046927SAndroid Build Coastguard Worker static VkResult update_##SS##_##SET(struct vk_video_session_parameters *params, \
261*61046927SAndroid Build Coastguard Worker uint32_t count, const PARAMSET *updates) { \
262*61046927SAndroid Build Coastguard Worker if (params->SS.SET##_count + count >= params->SS.max_##SET##_count) \
263*61046927SAndroid Build Coastguard Worker return VK_ERROR_TOO_MANY_OBJECTS; \
264*61046927SAndroid Build Coastguard Worker for (unsigned _c = 0; _c < count; _c++) \
265*61046927SAndroid Build Coastguard Worker vk_video_deep_copy_##SET(¶ms->SS.SET[params->SS.SET##_count + _c], &updates[_c]); \
266*61046927SAndroid Build Coastguard Worker params->SS.SET##_count += count; \
267*61046927SAndroid Build Coastguard Worker return VK_SUCCESS; \
268*61046927SAndroid Build Coastguard Worker }
269*61046927SAndroid Build Coastguard Worker
FIND(StdVideoH264SequenceParameterSet,h264_dec,h264_sps,seq_parameter_set_id)270*61046927SAndroid Build Coastguard Worker FIND(StdVideoH264SequenceParameterSet, h264_dec, h264_sps, seq_parameter_set_id)
271*61046927SAndroid Build Coastguard Worker FIND(StdVideoH264PictureParameterSet, h264_dec, h264_pps, pic_parameter_set_id)
272*61046927SAndroid Build Coastguard Worker FIND(StdVideoH265VideoParameterSet, h265_dec, h265_vps, vps_video_parameter_set_id)
273*61046927SAndroid Build Coastguard Worker FIND(StdVideoH265SequenceParameterSet, h265_dec, h265_sps, sps_seq_parameter_set_id)
274*61046927SAndroid Build Coastguard Worker FIND(StdVideoH265PictureParameterSet, h265_dec, h265_pps, pps_pic_parameter_set_id)
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker FIND(StdVideoH264SequenceParameterSet, h264_enc, h264_sps, seq_parameter_set_id)
277*61046927SAndroid Build Coastguard Worker FIND(StdVideoH264PictureParameterSet, h264_enc, h264_pps, pic_parameter_set_id)
278*61046927SAndroid Build Coastguard Worker
279*61046927SAndroid Build Coastguard Worker FIND(StdVideoH265VideoParameterSet, h265_enc, h265_vps, vps_video_parameter_set_id)
280*61046927SAndroid Build Coastguard Worker FIND(StdVideoH265SequenceParameterSet, h265_enc, h265_sps, sps_seq_parameter_set_id)
281*61046927SAndroid Build Coastguard Worker FIND(StdVideoH265PictureParameterSet, h265_enc, h265_pps, pps_pic_parameter_set_id)
282*61046927SAndroid Build Coastguard Worker
283*61046927SAndroid Build Coastguard Worker static void
284*61046927SAndroid Build Coastguard Worker init_add_h264_dec_session_parameters(struct vk_video_session_parameters *params,
285*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH264SessionParametersAddInfoKHR *h264_add,
286*61046927SAndroid Build Coastguard Worker const struct vk_video_session_parameters *templ)
287*61046927SAndroid Build Coastguard Worker {
288*61046927SAndroid Build Coastguard Worker unsigned i;
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker if (h264_add) {
291*61046927SAndroid Build Coastguard Worker for (i = 0; i < h264_add->stdSPSCount; i++) {
292*61046927SAndroid Build Coastguard Worker add_h264_dec_h264_sps(params, &h264_add->pStdSPSs[i], false);
293*61046927SAndroid Build Coastguard Worker }
294*61046927SAndroid Build Coastguard Worker }
295*61046927SAndroid Build Coastguard Worker if (templ) {
296*61046927SAndroid Build Coastguard Worker for (i = 0; i < templ->h264_dec.h264_sps_count; i++) {
297*61046927SAndroid Build Coastguard Worker add_h264_dec_h264_sps(params, &templ->h264_dec.h264_sps[i].base, true);
298*61046927SAndroid Build Coastguard Worker }
299*61046927SAndroid Build Coastguard Worker }
300*61046927SAndroid Build Coastguard Worker
301*61046927SAndroid Build Coastguard Worker if (h264_add) {
302*61046927SAndroid Build Coastguard Worker for (i = 0; i < h264_add->stdPPSCount; i++) {
303*61046927SAndroid Build Coastguard Worker add_h264_dec_h264_pps(params, &h264_add->pStdPPSs[i], false);
304*61046927SAndroid Build Coastguard Worker }
305*61046927SAndroid Build Coastguard Worker }
306*61046927SAndroid Build Coastguard Worker if (templ) {
307*61046927SAndroid Build Coastguard Worker for (i = 0; i < templ->h264_dec.h264_pps_count; i++) {
308*61046927SAndroid Build Coastguard Worker add_h264_dec_h264_pps(params, &templ->h264_dec.h264_pps[i].base, true);
309*61046927SAndroid Build Coastguard Worker }
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker }
312*61046927SAndroid Build Coastguard Worker
313*61046927SAndroid Build Coastguard Worker static void
init_add_h264_enc_session_parameters(struct vk_video_session_parameters * params,const struct VkVideoEncodeH264SessionParametersAddInfoKHR * h264_add,const struct vk_video_session_parameters * templ)314*61046927SAndroid Build Coastguard Worker init_add_h264_enc_session_parameters(struct vk_video_session_parameters *params,
315*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH264SessionParametersAddInfoKHR *h264_add,
316*61046927SAndroid Build Coastguard Worker const struct vk_video_session_parameters *templ)
317*61046927SAndroid Build Coastguard Worker {
318*61046927SAndroid Build Coastguard Worker unsigned i;
319*61046927SAndroid Build Coastguard Worker if (h264_add) {
320*61046927SAndroid Build Coastguard Worker for (i = 0; i < h264_add->stdSPSCount; i++) {
321*61046927SAndroid Build Coastguard Worker add_h264_enc_h264_sps(params, &h264_add->pStdSPSs[i], false);
322*61046927SAndroid Build Coastguard Worker }
323*61046927SAndroid Build Coastguard Worker }
324*61046927SAndroid Build Coastguard Worker if (templ) {
325*61046927SAndroid Build Coastguard Worker for (i = 0; i < templ->h264_dec.h264_sps_count; i++) {
326*61046927SAndroid Build Coastguard Worker add_h264_enc_h264_sps(params, &templ->h264_enc.h264_sps[i].base, true);
327*61046927SAndroid Build Coastguard Worker }
328*61046927SAndroid Build Coastguard Worker }
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker if (h264_add) {
331*61046927SAndroid Build Coastguard Worker for (i = 0; i < h264_add->stdPPSCount; i++) {
332*61046927SAndroid Build Coastguard Worker add_h264_enc_h264_pps(params, &h264_add->pStdPPSs[i], false);
333*61046927SAndroid Build Coastguard Worker }
334*61046927SAndroid Build Coastguard Worker }
335*61046927SAndroid Build Coastguard Worker if (templ) {
336*61046927SAndroid Build Coastguard Worker for (i = 0; i < templ->h264_enc.h264_pps_count; i++) {
337*61046927SAndroid Build Coastguard Worker add_h264_enc_h264_pps(params, &templ->h264_enc.h264_pps[i].base, true);
338*61046927SAndroid Build Coastguard Worker }
339*61046927SAndroid Build Coastguard Worker }
340*61046927SAndroid Build Coastguard Worker }
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker static void
init_add_h265_dec_session_parameters(struct vk_video_session_parameters * params,const struct VkVideoDecodeH265SessionParametersAddInfoKHR * h265_add,const struct vk_video_session_parameters * templ)343*61046927SAndroid Build Coastguard Worker init_add_h265_dec_session_parameters(struct vk_video_session_parameters *params,
344*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265SessionParametersAddInfoKHR *h265_add,
345*61046927SAndroid Build Coastguard Worker const struct vk_video_session_parameters *templ)
346*61046927SAndroid Build Coastguard Worker {
347*61046927SAndroid Build Coastguard Worker unsigned i;
348*61046927SAndroid Build Coastguard Worker
349*61046927SAndroid Build Coastguard Worker if (h265_add) {
350*61046927SAndroid Build Coastguard Worker for (i = 0; i < h265_add->stdVPSCount; i++) {
351*61046927SAndroid Build Coastguard Worker add_h265_dec_h265_vps(params, &h265_add->pStdVPSs[i], false);
352*61046927SAndroid Build Coastguard Worker }
353*61046927SAndroid Build Coastguard Worker }
354*61046927SAndroid Build Coastguard Worker if (templ) {
355*61046927SAndroid Build Coastguard Worker for (i = 0; i < templ->h265_dec.h265_vps_count; i++) {
356*61046927SAndroid Build Coastguard Worker add_h265_dec_h265_vps(params, &templ->h265_dec.h265_vps[i].base, true);
357*61046927SAndroid Build Coastguard Worker }
358*61046927SAndroid Build Coastguard Worker }
359*61046927SAndroid Build Coastguard Worker if (h265_add) {
360*61046927SAndroid Build Coastguard Worker for (i = 0; i < h265_add->stdSPSCount; i++) {
361*61046927SAndroid Build Coastguard Worker add_h265_dec_h265_sps(params, &h265_add->pStdSPSs[i], false);
362*61046927SAndroid Build Coastguard Worker }
363*61046927SAndroid Build Coastguard Worker }
364*61046927SAndroid Build Coastguard Worker if (templ) {
365*61046927SAndroid Build Coastguard Worker for (i = 0; i < templ->h265_dec.h265_sps_count; i++) {
366*61046927SAndroid Build Coastguard Worker add_h265_dec_h265_sps(params, &templ->h265_dec.h265_sps[i].base, true);
367*61046927SAndroid Build Coastguard Worker }
368*61046927SAndroid Build Coastguard Worker }
369*61046927SAndroid Build Coastguard Worker
370*61046927SAndroid Build Coastguard Worker if (h265_add) {
371*61046927SAndroid Build Coastguard Worker for (i = 0; i < h265_add->stdPPSCount; i++) {
372*61046927SAndroid Build Coastguard Worker add_h265_dec_h265_pps(params, &h265_add->pStdPPSs[i], false);
373*61046927SAndroid Build Coastguard Worker }
374*61046927SAndroid Build Coastguard Worker }
375*61046927SAndroid Build Coastguard Worker if (templ) {
376*61046927SAndroid Build Coastguard Worker for (i = 0; i < templ->h265_dec.h265_pps_count; i++) {
377*61046927SAndroid Build Coastguard Worker add_h265_dec_h265_pps(params, &templ->h265_dec.h265_pps[i].base, true);
378*61046927SAndroid Build Coastguard Worker }
379*61046927SAndroid Build Coastguard Worker }
380*61046927SAndroid Build Coastguard Worker }
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Worker static void
init_add_h265_enc_session_parameters(struct vk_video_session_parameters * params,const struct VkVideoEncodeH265SessionParametersAddInfoKHR * h265_add,const struct vk_video_session_parameters * templ)383*61046927SAndroid Build Coastguard Worker init_add_h265_enc_session_parameters(struct vk_video_session_parameters *params,
384*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH265SessionParametersAddInfoKHR *h265_add,
385*61046927SAndroid Build Coastguard Worker const struct vk_video_session_parameters *templ)
386*61046927SAndroid Build Coastguard Worker {
387*61046927SAndroid Build Coastguard Worker unsigned i;
388*61046927SAndroid Build Coastguard Worker
389*61046927SAndroid Build Coastguard Worker if (h265_add) {
390*61046927SAndroid Build Coastguard Worker for (i = 0; i < h265_add->stdVPSCount; i++) {
391*61046927SAndroid Build Coastguard Worker add_h265_enc_h265_vps(params, &h265_add->pStdVPSs[i], false);
392*61046927SAndroid Build Coastguard Worker }
393*61046927SAndroid Build Coastguard Worker }
394*61046927SAndroid Build Coastguard Worker if (templ) {
395*61046927SAndroid Build Coastguard Worker for (i = 0; i < templ->h265_enc.h265_vps_count; i++) {
396*61046927SAndroid Build Coastguard Worker add_h265_enc_h265_vps(params, &templ->h265_enc.h265_vps[i].base, true);
397*61046927SAndroid Build Coastguard Worker }
398*61046927SAndroid Build Coastguard Worker }
399*61046927SAndroid Build Coastguard Worker if (h265_add) {
400*61046927SAndroid Build Coastguard Worker for (i = 0; i < h265_add->stdSPSCount; i++) {
401*61046927SAndroid Build Coastguard Worker add_h265_enc_h265_sps(params, &h265_add->pStdSPSs[i], false);
402*61046927SAndroid Build Coastguard Worker }
403*61046927SAndroid Build Coastguard Worker }
404*61046927SAndroid Build Coastguard Worker if (templ) {
405*61046927SAndroid Build Coastguard Worker for (i = 0; i < templ->h265_enc.h265_sps_count; i++) {
406*61046927SAndroid Build Coastguard Worker add_h265_enc_h265_sps(params, &templ->h265_enc.h265_sps[i].base, true);
407*61046927SAndroid Build Coastguard Worker }
408*61046927SAndroid Build Coastguard Worker }
409*61046927SAndroid Build Coastguard Worker
410*61046927SAndroid Build Coastguard Worker if (h265_add) {
411*61046927SAndroid Build Coastguard Worker for (i = 0; i < h265_add->stdPPSCount; i++) {
412*61046927SAndroid Build Coastguard Worker add_h265_enc_h265_pps(params, &h265_add->pStdPPSs[i], false);
413*61046927SAndroid Build Coastguard Worker }
414*61046927SAndroid Build Coastguard Worker }
415*61046927SAndroid Build Coastguard Worker if (templ) {
416*61046927SAndroid Build Coastguard Worker for (i = 0; i < templ->h265_enc.h265_pps_count; i++) {
417*61046927SAndroid Build Coastguard Worker add_h265_enc_h265_pps(params, &templ->h265_enc.h265_pps[i].base, true);
418*61046927SAndroid Build Coastguard Worker }
419*61046927SAndroid Build Coastguard Worker }
420*61046927SAndroid Build Coastguard Worker }
421*61046927SAndroid Build Coastguard Worker
422*61046927SAndroid Build Coastguard Worker static void
vk_video_deep_copy_av1_seq_hdr(struct vk_video_av1_seq_hdr * dst,const StdVideoAV1SequenceHeader * src)423*61046927SAndroid Build Coastguard Worker vk_video_deep_copy_av1_seq_hdr(struct vk_video_av1_seq_hdr *dst,
424*61046927SAndroid Build Coastguard Worker const StdVideoAV1SequenceHeader *src)
425*61046927SAndroid Build Coastguard Worker {
426*61046927SAndroid Build Coastguard Worker memcpy(&dst->base, src, sizeof(StdVideoAV1SequenceHeader));
427*61046927SAndroid Build Coastguard Worker if (src->pColorConfig) {
428*61046927SAndroid Build Coastguard Worker memcpy(&dst->color_config, src->pColorConfig, sizeof(StdVideoAV1ColorConfig));
429*61046927SAndroid Build Coastguard Worker dst->base.pColorConfig = &dst->color_config;
430*61046927SAndroid Build Coastguard Worker }
431*61046927SAndroid Build Coastguard Worker if (src->pTimingInfo) {
432*61046927SAndroid Build Coastguard Worker memcpy(&dst->timing_info, src->pTimingInfo, sizeof(StdVideoAV1TimingInfo));
433*61046927SAndroid Build Coastguard Worker dst->base.pTimingInfo = &dst->timing_info;
434*61046927SAndroid Build Coastguard Worker }
435*61046927SAndroid Build Coastguard Worker }
436*61046927SAndroid Build Coastguard Worker
437*61046927SAndroid Build Coastguard Worker VkResult
vk_video_session_parameters_init(struct vk_device * device,struct vk_video_session_parameters * params,const struct vk_video_session * vid,const struct vk_video_session_parameters * templ,const VkVideoSessionParametersCreateInfoKHR * create_info)438*61046927SAndroid Build Coastguard Worker vk_video_session_parameters_init(struct vk_device *device,
439*61046927SAndroid Build Coastguard Worker struct vk_video_session_parameters *params,
440*61046927SAndroid Build Coastguard Worker const struct vk_video_session *vid,
441*61046927SAndroid Build Coastguard Worker const struct vk_video_session_parameters *templ,
442*61046927SAndroid Build Coastguard Worker const VkVideoSessionParametersCreateInfoKHR *create_info)
443*61046927SAndroid Build Coastguard Worker {
444*61046927SAndroid Build Coastguard Worker memset(params, 0, sizeof(*params));
445*61046927SAndroid Build Coastguard Worker vk_object_base_init(device, ¶ms->base, VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR);
446*61046927SAndroid Build Coastguard Worker
447*61046927SAndroid Build Coastguard Worker params->op = vid->op;
448*61046927SAndroid Build Coastguard Worker
449*61046927SAndroid Build Coastguard Worker switch (vid->op) {
450*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: {
451*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH264SessionParametersCreateInfoKHR *h264_create =
452*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pNext, VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR);
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Worker params->h264_dec.max_h264_sps_count = h264_create->maxStdSPSCount;
455*61046927SAndroid Build Coastguard Worker params->h264_dec.max_h264_pps_count = h264_create->maxStdPPSCount;
456*61046927SAndroid Build Coastguard Worker
457*61046927SAndroid Build Coastguard Worker uint32_t sps_size = params->h264_dec.max_h264_sps_count * sizeof(struct vk_video_h264_sps);
458*61046927SAndroid Build Coastguard Worker uint32_t pps_size = params->h264_dec.max_h264_pps_count * sizeof(struct vk_video_h264_pps);
459*61046927SAndroid Build Coastguard Worker
460*61046927SAndroid Build Coastguard Worker params->h264_dec.h264_sps = vk_alloc(&device->alloc, sps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
461*61046927SAndroid Build Coastguard Worker params->h264_dec.h264_pps = vk_alloc(&device->alloc, pps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
462*61046927SAndroid Build Coastguard Worker if (!params->h264_dec.h264_sps || !params->h264_dec.h264_pps) {
463*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h264_dec.h264_sps);
464*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h264_dec.h264_pps);
465*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
466*61046927SAndroid Build Coastguard Worker }
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker init_add_h264_dec_session_parameters(params, h264_create->pParametersAddInfo, templ);
469*61046927SAndroid Build Coastguard Worker break;
470*61046927SAndroid Build Coastguard Worker }
471*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: {
472*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265SessionParametersCreateInfoKHR *h265_create =
473*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pNext, VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR);
474*61046927SAndroid Build Coastguard Worker
475*61046927SAndroid Build Coastguard Worker params->h265_dec.max_h265_vps_count = h265_create->maxStdVPSCount;
476*61046927SAndroid Build Coastguard Worker params->h265_dec.max_h265_sps_count = h265_create->maxStdSPSCount;
477*61046927SAndroid Build Coastguard Worker params->h265_dec.max_h265_pps_count = h265_create->maxStdPPSCount;
478*61046927SAndroid Build Coastguard Worker
479*61046927SAndroid Build Coastguard Worker uint32_t vps_size = params->h265_dec.max_h265_vps_count * sizeof(struct vk_video_h265_vps);
480*61046927SAndroid Build Coastguard Worker uint32_t sps_size = params->h265_dec.max_h265_sps_count * sizeof(struct vk_video_h265_sps);
481*61046927SAndroid Build Coastguard Worker uint32_t pps_size = params->h265_dec.max_h265_pps_count * sizeof(struct vk_video_h265_pps);
482*61046927SAndroid Build Coastguard Worker
483*61046927SAndroid Build Coastguard Worker params->h265_dec.h265_vps = vk_alloc(&device->alloc, vps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
484*61046927SAndroid Build Coastguard Worker params->h265_dec.h265_sps = vk_alloc(&device->alloc, sps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
485*61046927SAndroid Build Coastguard Worker params->h265_dec.h265_pps = vk_alloc(&device->alloc, pps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
486*61046927SAndroid Build Coastguard Worker if (!params->h265_dec.h265_sps || !params->h265_dec.h265_pps || !params->h265_dec.h265_vps) {
487*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_dec.h265_vps);
488*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_dec.h265_sps);
489*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_dec.h265_pps);
490*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
491*61046927SAndroid Build Coastguard Worker }
492*61046927SAndroid Build Coastguard Worker
493*61046927SAndroid Build Coastguard Worker init_add_h265_dec_session_parameters(params, h265_create->pParametersAddInfo, templ);
494*61046927SAndroid Build Coastguard Worker break;
495*61046927SAndroid Build Coastguard Worker }
496*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR: {
497*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeAV1SessionParametersCreateInfoKHR *av1_create =
498*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pNext, VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR);
499*61046927SAndroid Build Coastguard Worker if (av1_create && av1_create->pStdSequenceHeader) {
500*61046927SAndroid Build Coastguard Worker vk_video_deep_copy_av1_seq_hdr(¶ms->av1_dec.seq_hdr,
501*61046927SAndroid Build Coastguard Worker av1_create->pStdSequenceHeader);
502*61046927SAndroid Build Coastguard Worker }
503*61046927SAndroid Build Coastguard Worker break;
504*61046927SAndroid Build Coastguard Worker }
505*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: {
506*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH264SessionParametersCreateInfoKHR *h264_create =
507*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pNext, VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR);
508*61046927SAndroid Build Coastguard Worker
509*61046927SAndroid Build Coastguard Worker params->h264_enc.max_h264_sps_count = h264_create->maxStdSPSCount;
510*61046927SAndroid Build Coastguard Worker params->h264_enc.max_h264_pps_count = h264_create->maxStdPPSCount;
511*61046927SAndroid Build Coastguard Worker
512*61046927SAndroid Build Coastguard Worker uint32_t sps_size = params->h264_enc.max_h264_sps_count * sizeof(struct vk_video_h264_sps);
513*61046927SAndroid Build Coastguard Worker uint32_t pps_size = params->h264_enc.max_h264_pps_count * sizeof(struct vk_video_h264_pps);
514*61046927SAndroid Build Coastguard Worker
515*61046927SAndroid Build Coastguard Worker params->h264_enc.h264_sps = vk_alloc(&device->alloc, sps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
516*61046927SAndroid Build Coastguard Worker params->h264_enc.h264_pps = vk_alloc(&device->alloc, pps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
517*61046927SAndroid Build Coastguard Worker if (!params->h264_enc.h264_sps || !params->h264_enc.h264_pps) {
518*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h264_enc.h264_sps);
519*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h264_enc.h264_pps);
520*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
521*61046927SAndroid Build Coastguard Worker }
522*61046927SAndroid Build Coastguard Worker
523*61046927SAndroid Build Coastguard Worker params->h264_enc.profile_idc = vid->h264.profile_idc;
524*61046927SAndroid Build Coastguard Worker init_add_h264_enc_session_parameters(params, h264_create->pParametersAddInfo, templ);
525*61046927SAndroid Build Coastguard Worker break;
526*61046927SAndroid Build Coastguard Worker }
527*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: {
528*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH265SessionParametersCreateInfoKHR *h265_create =
529*61046927SAndroid Build Coastguard Worker vk_find_struct_const(create_info->pNext, VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR);
530*61046927SAndroid Build Coastguard Worker
531*61046927SAndroid Build Coastguard Worker params->h265_enc.max_h265_vps_count = h265_create->maxStdVPSCount;
532*61046927SAndroid Build Coastguard Worker params->h265_enc.max_h265_sps_count = h265_create->maxStdSPSCount;
533*61046927SAndroid Build Coastguard Worker params->h265_enc.max_h265_pps_count = h265_create->maxStdPPSCount;
534*61046927SAndroid Build Coastguard Worker
535*61046927SAndroid Build Coastguard Worker uint32_t vps_size = params->h265_enc.max_h265_vps_count * sizeof(struct vk_video_h265_vps);
536*61046927SAndroid Build Coastguard Worker uint32_t sps_size = params->h265_enc.max_h265_sps_count * sizeof(struct vk_video_h265_sps);
537*61046927SAndroid Build Coastguard Worker uint32_t pps_size = params->h265_enc.max_h265_pps_count * sizeof(struct vk_video_h265_pps);
538*61046927SAndroid Build Coastguard Worker
539*61046927SAndroid Build Coastguard Worker params->h265_enc.h265_vps = vk_alloc(&device->alloc, vps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
540*61046927SAndroid Build Coastguard Worker params->h265_enc.h265_sps = vk_alloc(&device->alloc, sps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
541*61046927SAndroid Build Coastguard Worker params->h265_enc.h265_pps = vk_alloc(&device->alloc, pps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
542*61046927SAndroid Build Coastguard Worker if (!params->h265_enc.h265_sps || !params->h265_enc.h265_pps || !params->h265_enc.h265_vps) {
543*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_enc.h265_vps);
544*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_enc.h265_sps);
545*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_enc.h265_pps);
546*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
547*61046927SAndroid Build Coastguard Worker }
548*61046927SAndroid Build Coastguard Worker
549*61046927SAndroid Build Coastguard Worker init_add_h265_enc_session_parameters(params, h265_create->pParametersAddInfo, templ);
550*61046927SAndroid Build Coastguard Worker break;
551*61046927SAndroid Build Coastguard Worker }
552*61046927SAndroid Build Coastguard Worker default:
553*61046927SAndroid Build Coastguard Worker unreachable("Unsupported video codec operation");
554*61046927SAndroid Build Coastguard Worker break;
555*61046927SAndroid Build Coastguard Worker }
556*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
557*61046927SAndroid Build Coastguard Worker }
558*61046927SAndroid Build Coastguard Worker
559*61046927SAndroid Build Coastguard Worker void
vk_video_session_parameters_finish(struct vk_device * device,struct vk_video_session_parameters * params)560*61046927SAndroid Build Coastguard Worker vk_video_session_parameters_finish(struct vk_device *device,
561*61046927SAndroid Build Coastguard Worker struct vk_video_session_parameters *params)
562*61046927SAndroid Build Coastguard Worker {
563*61046927SAndroid Build Coastguard Worker switch (params->op) {
564*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
565*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h264_dec.h264_sps);
566*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h264_dec.h264_pps);
567*61046927SAndroid Build Coastguard Worker break;
568*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
569*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_dec.h265_vps);
570*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_dec.h265_sps);
571*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_dec.h265_pps);
572*61046927SAndroid Build Coastguard Worker break;
573*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
574*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h264_enc.h264_sps);
575*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h264_enc.h264_pps);
576*61046927SAndroid Build Coastguard Worker break;
577*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
578*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_enc.h265_vps);
579*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_enc.h265_sps);
580*61046927SAndroid Build Coastguard Worker vk_free(&device->alloc, params->h265_enc.h265_pps);
581*61046927SAndroid Build Coastguard Worker break;
582*61046927SAndroid Build Coastguard Worker default:
583*61046927SAndroid Build Coastguard Worker break;
584*61046927SAndroid Build Coastguard Worker }
585*61046927SAndroid Build Coastguard Worker vk_object_base_finish(¶ms->base);
586*61046927SAndroid Build Coastguard Worker }
587*61046927SAndroid Build Coastguard Worker
588*61046927SAndroid Build Coastguard Worker static VkResult
update_h264_dec_session_parameters(struct vk_video_session_parameters * params,const struct VkVideoDecodeH264SessionParametersAddInfoKHR * h264_add)589*61046927SAndroid Build Coastguard Worker update_h264_dec_session_parameters(struct vk_video_session_parameters *params,
590*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH264SessionParametersAddInfoKHR *h264_add)
591*61046927SAndroid Build Coastguard Worker {
592*61046927SAndroid Build Coastguard Worker VkResult result = VK_SUCCESS;
593*61046927SAndroid Build Coastguard Worker
594*61046927SAndroid Build Coastguard Worker result = update_h264_dec_h264_sps(params, h264_add->stdSPSCount, h264_add->pStdSPSs);
595*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
596*61046927SAndroid Build Coastguard Worker return result;
597*61046927SAndroid Build Coastguard Worker
598*61046927SAndroid Build Coastguard Worker result = update_h264_dec_h264_pps(params, h264_add->stdPPSCount, h264_add->pStdPPSs);
599*61046927SAndroid Build Coastguard Worker return result;
600*61046927SAndroid Build Coastguard Worker }
601*61046927SAndroid Build Coastguard Worker
602*61046927SAndroid Build Coastguard Worker static VkResult
update_h264_enc_session_parameters(struct vk_video_session_parameters * params,const struct VkVideoEncodeH264SessionParametersAddInfoKHR * h264_add)603*61046927SAndroid Build Coastguard Worker update_h264_enc_session_parameters(struct vk_video_session_parameters *params,
604*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH264SessionParametersAddInfoKHR *h264_add)
605*61046927SAndroid Build Coastguard Worker {
606*61046927SAndroid Build Coastguard Worker VkResult result = VK_SUCCESS;
607*61046927SAndroid Build Coastguard Worker result = update_h264_enc_h264_sps(params, h264_add->stdSPSCount, h264_add->pStdSPSs);
608*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
609*61046927SAndroid Build Coastguard Worker return result;
610*61046927SAndroid Build Coastguard Worker
611*61046927SAndroid Build Coastguard Worker result = update_h264_enc_h264_pps(params, h264_add->stdPPSCount, h264_add->pStdPPSs);
612*61046927SAndroid Build Coastguard Worker return result;
613*61046927SAndroid Build Coastguard Worker }
614*61046927SAndroid Build Coastguard Worker
615*61046927SAndroid Build Coastguard Worker static VkResult
update_h265_enc_session_parameters(struct vk_video_session_parameters * params,const struct VkVideoEncodeH265SessionParametersAddInfoKHR * h265_add)616*61046927SAndroid Build Coastguard Worker update_h265_enc_session_parameters(struct vk_video_session_parameters *params,
617*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH265SessionParametersAddInfoKHR *h265_add)
618*61046927SAndroid Build Coastguard Worker {
619*61046927SAndroid Build Coastguard Worker VkResult result = VK_SUCCESS;
620*61046927SAndroid Build Coastguard Worker
621*61046927SAndroid Build Coastguard Worker result = update_h265_enc_h265_vps(params, h265_add->stdVPSCount, h265_add->pStdVPSs);
622*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
623*61046927SAndroid Build Coastguard Worker return result;
624*61046927SAndroid Build Coastguard Worker
625*61046927SAndroid Build Coastguard Worker result = update_h265_enc_h265_sps(params, h265_add->stdSPSCount, h265_add->pStdSPSs);
626*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
627*61046927SAndroid Build Coastguard Worker return result;
628*61046927SAndroid Build Coastguard Worker
629*61046927SAndroid Build Coastguard Worker result = update_h265_enc_h265_pps(params, h265_add->stdPPSCount, h265_add->pStdPPSs);
630*61046927SAndroid Build Coastguard Worker return result;
631*61046927SAndroid Build Coastguard Worker }
632*61046927SAndroid Build Coastguard Worker
633*61046927SAndroid Build Coastguard Worker static VkResult
update_h265_session_parameters(struct vk_video_session_parameters * params,const struct VkVideoDecodeH265SessionParametersAddInfoKHR * h265_add)634*61046927SAndroid Build Coastguard Worker update_h265_session_parameters(struct vk_video_session_parameters *params,
635*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265SessionParametersAddInfoKHR *h265_add)
636*61046927SAndroid Build Coastguard Worker {
637*61046927SAndroid Build Coastguard Worker VkResult result = VK_SUCCESS;
638*61046927SAndroid Build Coastguard Worker result = update_h265_dec_h265_vps(params, h265_add->stdVPSCount, h265_add->pStdVPSs);
639*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
640*61046927SAndroid Build Coastguard Worker return result;
641*61046927SAndroid Build Coastguard Worker
642*61046927SAndroid Build Coastguard Worker result = update_h265_dec_h265_sps(params, h265_add->stdSPSCount, h265_add->pStdSPSs);
643*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
644*61046927SAndroid Build Coastguard Worker return result;
645*61046927SAndroid Build Coastguard Worker
646*61046927SAndroid Build Coastguard Worker result = update_h265_dec_h265_pps(params, h265_add->stdPPSCount, h265_add->pStdPPSs);
647*61046927SAndroid Build Coastguard Worker return result;
648*61046927SAndroid Build Coastguard Worker }
649*61046927SAndroid Build Coastguard Worker
650*61046927SAndroid Build Coastguard Worker VkResult
vk_video_session_parameters_update(struct vk_video_session_parameters * params,const VkVideoSessionParametersUpdateInfoKHR * update)651*61046927SAndroid Build Coastguard Worker vk_video_session_parameters_update(struct vk_video_session_parameters *params,
652*61046927SAndroid Build Coastguard Worker const VkVideoSessionParametersUpdateInfoKHR *update)
653*61046927SAndroid Build Coastguard Worker {
654*61046927SAndroid Build Coastguard Worker /* 39.6.5. Decoder Parameter Sets -
655*61046927SAndroid Build Coastguard Worker * "The provided H.264 SPS/PPS parameters must be within the limits specified during decoder
656*61046927SAndroid Build Coastguard Worker * creation for the decoder specified in VkVideoSessionParametersCreateInfoKHR."
657*61046927SAndroid Build Coastguard Worker */
658*61046927SAndroid Build Coastguard Worker
659*61046927SAndroid Build Coastguard Worker /*
660*61046927SAndroid Build Coastguard Worker * There is no need to deduplicate here.
661*61046927SAndroid Build Coastguard Worker * videoSessionParameters must not already contain a StdVideoH264PictureParameterSet entry with
662*61046927SAndroid Build Coastguard Worker * both seq_parameter_set_id and pic_parameter_set_id matching any of the elements of
663*61046927SAndroid Build Coastguard Worker * VkVideoDecodeH264SessionParametersAddInfoKHR::pStdPPS
664*61046927SAndroid Build Coastguard Worker */
665*61046927SAndroid Build Coastguard Worker VkResult result = VK_SUCCESS;
666*61046927SAndroid Build Coastguard Worker
667*61046927SAndroid Build Coastguard Worker switch (params->op) {
668*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: {
669*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH264SessionParametersAddInfoKHR *h264_add =
670*61046927SAndroid Build Coastguard Worker vk_find_struct_const(update->pNext, VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR);
671*61046927SAndroid Build Coastguard Worker return update_h264_dec_session_parameters(params, h264_add);
672*61046927SAndroid Build Coastguard Worker }
673*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: {
674*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265SessionParametersAddInfoKHR *h265_add =
675*61046927SAndroid Build Coastguard Worker vk_find_struct_const(update->pNext, VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR);
676*61046927SAndroid Build Coastguard Worker
677*61046927SAndroid Build Coastguard Worker return update_h265_session_parameters(params, h265_add);
678*61046927SAndroid Build Coastguard Worker }
679*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: {
680*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH264SessionParametersAddInfoKHR *h264_add =
681*61046927SAndroid Build Coastguard Worker vk_find_struct_const(update->pNext, VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR);
682*61046927SAndroid Build Coastguard Worker return update_h264_enc_session_parameters(params, h264_add);
683*61046927SAndroid Build Coastguard Worker }
684*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: {
685*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH265SessionParametersAddInfoKHR *h265_add =
686*61046927SAndroid Build Coastguard Worker vk_find_struct_const(update->pNext, VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR);
687*61046927SAndroid Build Coastguard Worker return update_h265_enc_session_parameters(params, h265_add);
688*61046927SAndroid Build Coastguard Worker }
689*61046927SAndroid Build Coastguard Worker default:
690*61046927SAndroid Build Coastguard Worker unreachable("Unknown codec\n");
691*61046927SAndroid Build Coastguard Worker }
692*61046927SAndroid Build Coastguard Worker return result;
693*61046927SAndroid Build Coastguard Worker }
694*61046927SAndroid Build Coastguard Worker
695*61046927SAndroid Build Coastguard Worker const uint8_t h264_scaling_list_default_4x4_intra[] =
696*61046927SAndroid Build Coastguard Worker {
697*61046927SAndroid Build Coastguard Worker /* Table 7-3 - Default_4x4_Intra */
698*61046927SAndroid Build Coastguard Worker 6, 13, 13, 20, 20, 20, 28, 28, 28, 28, 32, 32, 32, 37, 37, 42
699*61046927SAndroid Build Coastguard Worker };
700*61046927SAndroid Build Coastguard Worker
701*61046927SAndroid Build Coastguard Worker const uint8_t h264_scaling_list_default_4x4_inter[] =
702*61046927SAndroid Build Coastguard Worker {
703*61046927SAndroid Build Coastguard Worker /* Table 7-3 - Default_4x4_Inter */
704*61046927SAndroid Build Coastguard Worker 10, 14, 14, 20, 20, 20, 24, 24, 24, 24, 27, 27, 27, 30, 30, 34
705*61046927SAndroid Build Coastguard Worker };
706*61046927SAndroid Build Coastguard Worker
707*61046927SAndroid Build Coastguard Worker const uint8_t h264_scaling_list_default_8x8_intra[] =
708*61046927SAndroid Build Coastguard Worker {
709*61046927SAndroid Build Coastguard Worker /* Table 7-4 - Default_8x8_Intra */
710*61046927SAndroid Build Coastguard Worker 6, 10, 10, 13, 11, 13, 16, 16, 16, 16, 18, 18, 18, 18, 18, 23,
711*61046927SAndroid Build Coastguard Worker 23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27,
712*61046927SAndroid Build Coastguard Worker 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31,
713*61046927SAndroid Build Coastguard Worker 31, 33, 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42,
714*61046927SAndroid Build Coastguard Worker };
715*61046927SAndroid Build Coastguard Worker
716*61046927SAndroid Build Coastguard Worker const uint8_t h264_scaling_list_default_8x8_inter[] =
717*61046927SAndroid Build Coastguard Worker {
718*61046927SAndroid Build Coastguard Worker /* Table 7-4 - Default_8x8_Inter */
719*61046927SAndroid Build Coastguard Worker 9 , 13, 13, 15, 13, 15, 17, 17, 17, 17, 19, 19, 19, 19, 19, 21,
720*61046927SAndroid Build Coastguard Worker 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24,
721*61046927SAndroid Build Coastguard Worker 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27,
722*61046927SAndroid Build Coastguard Worker 27, 28, 28, 28, 28, 28, 30, 30, 30, 30, 32, 32, 32, 33, 33, 35,
723*61046927SAndroid Build Coastguard Worker };
724*61046927SAndroid Build Coastguard Worker
725*61046927SAndroid Build Coastguard Worker void
vk_video_derive_h264_scaling_list(const StdVideoH264SequenceParameterSet * sps,const StdVideoH264PictureParameterSet * pps,StdVideoH264ScalingLists * list)726*61046927SAndroid Build Coastguard Worker vk_video_derive_h264_scaling_list(const StdVideoH264SequenceParameterSet *sps,
727*61046927SAndroid Build Coastguard Worker const StdVideoH264PictureParameterSet *pps,
728*61046927SAndroid Build Coastguard Worker StdVideoH264ScalingLists *list)
729*61046927SAndroid Build Coastguard Worker {
730*61046927SAndroid Build Coastguard Worker StdVideoH264ScalingLists temp;
731*61046927SAndroid Build Coastguard Worker
732*61046927SAndroid Build Coastguard Worker /* derive SPS scaling list first, because PPS may depend on it in fall-back
733*61046927SAndroid Build Coastguard Worker * rule B */
734*61046927SAndroid Build Coastguard Worker if (sps->flags.seq_scaling_matrix_present_flag)
735*61046927SAndroid Build Coastguard Worker {
736*61046927SAndroid Build Coastguard Worker for (int i = 0; i < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS; i++)
737*61046927SAndroid Build Coastguard Worker {
738*61046927SAndroid Build Coastguard Worker if (sps->pScalingLists->scaling_list_present_mask & (1 << i))
739*61046927SAndroid Build Coastguard Worker memcpy(temp.ScalingList4x4[i],
740*61046927SAndroid Build Coastguard Worker sps->pScalingLists->ScalingList4x4[i],
741*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
742*61046927SAndroid Build Coastguard Worker else /* fall-back rule A */
743*61046927SAndroid Build Coastguard Worker {
744*61046927SAndroid Build Coastguard Worker if (i == 0)
745*61046927SAndroid Build Coastguard Worker memcpy(temp.ScalingList4x4[i],
746*61046927SAndroid Build Coastguard Worker h264_scaling_list_default_4x4_intra,
747*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
748*61046927SAndroid Build Coastguard Worker else if (i == 3)
749*61046927SAndroid Build Coastguard Worker memcpy(temp.ScalingList4x4[i],
750*61046927SAndroid Build Coastguard Worker h264_scaling_list_default_4x4_inter,
751*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
752*61046927SAndroid Build Coastguard Worker else
753*61046927SAndroid Build Coastguard Worker memcpy(temp.ScalingList4x4[i],
754*61046927SAndroid Build Coastguard Worker temp.ScalingList4x4[i - 1],
755*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
756*61046927SAndroid Build Coastguard Worker }
757*61046927SAndroid Build Coastguard Worker }
758*61046927SAndroid Build Coastguard Worker
759*61046927SAndroid Build Coastguard Worker for (int j = 0; j < STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS; j++)
760*61046927SAndroid Build Coastguard Worker {
761*61046927SAndroid Build Coastguard Worker int i = j + STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS;
762*61046927SAndroid Build Coastguard Worker if (sps->pScalingLists->scaling_list_present_mask & (1 << i))
763*61046927SAndroid Build Coastguard Worker memcpy(temp.ScalingList8x8[j], sps->pScalingLists->ScalingList8x8[j],
764*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
765*61046927SAndroid Build Coastguard Worker else /* fall-back rule A */
766*61046927SAndroid Build Coastguard Worker {
767*61046927SAndroid Build Coastguard Worker if (i == 6)
768*61046927SAndroid Build Coastguard Worker memcpy(temp.ScalingList8x8[j],
769*61046927SAndroid Build Coastguard Worker h264_scaling_list_default_8x8_intra,
770*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
771*61046927SAndroid Build Coastguard Worker else if (i == 7)
772*61046927SAndroid Build Coastguard Worker memcpy(temp.ScalingList8x8[j],
773*61046927SAndroid Build Coastguard Worker h264_scaling_list_default_8x8_inter,
774*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
775*61046927SAndroid Build Coastguard Worker else
776*61046927SAndroid Build Coastguard Worker memcpy(temp.ScalingList8x8[j], temp.ScalingList8x8[j - 2],
777*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
778*61046927SAndroid Build Coastguard Worker }
779*61046927SAndroid Build Coastguard Worker }
780*61046927SAndroid Build Coastguard Worker }
781*61046927SAndroid Build Coastguard Worker else
782*61046927SAndroid Build Coastguard Worker {
783*61046927SAndroid Build Coastguard Worker memset(temp.ScalingList4x4, 0x10,
784*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS *
785*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
786*61046927SAndroid Build Coastguard Worker memset(temp.ScalingList8x8, 0x10,
787*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS *
788*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
789*61046927SAndroid Build Coastguard Worker }
790*61046927SAndroid Build Coastguard Worker
791*61046927SAndroid Build Coastguard Worker if (pps->flags.pic_scaling_matrix_present_flag)
792*61046927SAndroid Build Coastguard Worker {
793*61046927SAndroid Build Coastguard Worker for (int i = 0; i < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS; i++)
794*61046927SAndroid Build Coastguard Worker {
795*61046927SAndroid Build Coastguard Worker if (pps->pScalingLists->scaling_list_present_mask & (1 << i))
796*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList4x4[i], pps->pScalingLists->ScalingList4x4[i],
797*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
798*61046927SAndroid Build Coastguard Worker else if (sps->flags.seq_scaling_matrix_present_flag) /* fall-back rule B */
799*61046927SAndroid Build Coastguard Worker {
800*61046927SAndroid Build Coastguard Worker if (i == 0 || i == 3)
801*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList4x4[i], temp.ScalingList4x4[i],
802*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
803*61046927SAndroid Build Coastguard Worker else
804*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList4x4[i], list->ScalingList4x4[i - 1],
805*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
806*61046927SAndroid Build Coastguard Worker }
807*61046927SAndroid Build Coastguard Worker else /* fall-back rule A */
808*61046927SAndroid Build Coastguard Worker {
809*61046927SAndroid Build Coastguard Worker if (i == 0)
810*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList4x4[i],
811*61046927SAndroid Build Coastguard Worker h264_scaling_list_default_4x4_intra,
812*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
813*61046927SAndroid Build Coastguard Worker else if (i == 3)
814*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList4x4[i],
815*61046927SAndroid Build Coastguard Worker h264_scaling_list_default_4x4_inter,
816*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
817*61046927SAndroid Build Coastguard Worker else
818*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList4x4[i],
819*61046927SAndroid Build Coastguard Worker list->ScalingList4x4[i - 1],
820*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
821*61046927SAndroid Build Coastguard Worker }
822*61046927SAndroid Build Coastguard Worker }
823*61046927SAndroid Build Coastguard Worker
824*61046927SAndroid Build Coastguard Worker for (int j = 0; j < STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS; j++)
825*61046927SAndroid Build Coastguard Worker {
826*61046927SAndroid Build Coastguard Worker int i = j + STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS;
827*61046927SAndroid Build Coastguard Worker if (pps->pScalingLists->scaling_list_present_mask & (1 << i))
828*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList8x8[j], pps->pScalingLists->ScalingList8x8[j],
829*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
830*61046927SAndroid Build Coastguard Worker else if (sps->flags.seq_scaling_matrix_present_flag) /* fall-back rule B */
831*61046927SAndroid Build Coastguard Worker {
832*61046927SAndroid Build Coastguard Worker if (i == 6 || i == 7)
833*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList8x8[j], temp.ScalingList8x8[j],
834*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
835*61046927SAndroid Build Coastguard Worker else
836*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList8x8[j], list->ScalingList8x8[j - 2],
837*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
838*61046927SAndroid Build Coastguard Worker }
839*61046927SAndroid Build Coastguard Worker else /* fall-back rule A */
840*61046927SAndroid Build Coastguard Worker {
841*61046927SAndroid Build Coastguard Worker if (i == 6)
842*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList8x8[j],
843*61046927SAndroid Build Coastguard Worker h264_scaling_list_default_8x8_intra,
844*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
845*61046927SAndroid Build Coastguard Worker else if (i == 7)
846*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList8x8[j],
847*61046927SAndroid Build Coastguard Worker h264_scaling_list_default_8x8_inter,
848*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
849*61046927SAndroid Build Coastguard Worker else
850*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList8x8[j], list->ScalingList8x8[j - 2],
851*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
852*61046927SAndroid Build Coastguard Worker }
853*61046927SAndroid Build Coastguard Worker }
854*61046927SAndroid Build Coastguard Worker }
855*61046927SAndroid Build Coastguard Worker else
856*61046927SAndroid Build Coastguard Worker {
857*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList4x4, temp.ScalingList4x4,
858*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS *
859*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
860*61046927SAndroid Build Coastguard Worker memcpy(list->ScalingList8x8, temp.ScalingList8x8,
861*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS *
862*61046927SAndroid Build Coastguard Worker STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
863*61046927SAndroid Build Coastguard Worker }
864*61046927SAndroid Build Coastguard Worker }
865*61046927SAndroid Build Coastguard Worker
866*61046927SAndroid Build Coastguard Worker const StdVideoH264SequenceParameterSet *
vk_video_find_h264_dec_std_sps(const struct vk_video_session_parameters * params,uint32_t id)867*61046927SAndroid Build Coastguard Worker vk_video_find_h264_dec_std_sps(const struct vk_video_session_parameters *params,
868*61046927SAndroid Build Coastguard Worker uint32_t id)
869*61046927SAndroid Build Coastguard Worker {
870*61046927SAndroid Build Coastguard Worker return &find_h264_dec_h264_sps(params, id)->base;
871*61046927SAndroid Build Coastguard Worker }
872*61046927SAndroid Build Coastguard Worker
873*61046927SAndroid Build Coastguard Worker const StdVideoH264PictureParameterSet *
vk_video_find_h264_dec_std_pps(const struct vk_video_session_parameters * params,uint32_t id)874*61046927SAndroid Build Coastguard Worker vk_video_find_h264_dec_std_pps(const struct vk_video_session_parameters *params,
875*61046927SAndroid Build Coastguard Worker uint32_t id)
876*61046927SAndroid Build Coastguard Worker {
877*61046927SAndroid Build Coastguard Worker return &find_h264_dec_h264_pps(params, id)->base;
878*61046927SAndroid Build Coastguard Worker }
879*61046927SAndroid Build Coastguard Worker
880*61046927SAndroid Build Coastguard Worker const StdVideoH265VideoParameterSet *
vk_video_find_h265_dec_std_vps(const struct vk_video_session_parameters * params,uint32_t id)881*61046927SAndroid Build Coastguard Worker vk_video_find_h265_dec_std_vps(const struct vk_video_session_parameters *params,
882*61046927SAndroid Build Coastguard Worker uint32_t id)
883*61046927SAndroid Build Coastguard Worker {
884*61046927SAndroid Build Coastguard Worker return &find_h265_dec_h265_vps(params, id)->base;
885*61046927SAndroid Build Coastguard Worker }
886*61046927SAndroid Build Coastguard Worker
887*61046927SAndroid Build Coastguard Worker const StdVideoH265SequenceParameterSet *
vk_video_find_h265_dec_std_sps(const struct vk_video_session_parameters * params,uint32_t id)888*61046927SAndroid Build Coastguard Worker vk_video_find_h265_dec_std_sps(const struct vk_video_session_parameters *params,
889*61046927SAndroid Build Coastguard Worker uint32_t id)
890*61046927SAndroid Build Coastguard Worker {
891*61046927SAndroid Build Coastguard Worker return &find_h265_dec_h265_sps(params, id)->base;
892*61046927SAndroid Build Coastguard Worker }
893*61046927SAndroid Build Coastguard Worker
894*61046927SAndroid Build Coastguard Worker const StdVideoH265PictureParameterSet *
vk_video_find_h265_dec_std_pps(const struct vk_video_session_parameters * params,uint32_t id)895*61046927SAndroid Build Coastguard Worker vk_video_find_h265_dec_std_pps(const struct vk_video_session_parameters *params,
896*61046927SAndroid Build Coastguard Worker uint32_t id)
897*61046927SAndroid Build Coastguard Worker {
898*61046927SAndroid Build Coastguard Worker return &find_h265_dec_h265_pps(params, id)->base;
899*61046927SAndroid Build Coastguard Worker }
900*61046927SAndroid Build Coastguard Worker
901*61046927SAndroid Build Coastguard Worker int
vk_video_h265_poc_by_slot(const struct VkVideoDecodeInfoKHR * frame_info,int slot)902*61046927SAndroid Build Coastguard Worker vk_video_h265_poc_by_slot(const struct VkVideoDecodeInfoKHR *frame_info, int slot)
903*61046927SAndroid Build Coastguard Worker {
904*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < frame_info->referenceSlotCount; i++) {
905*61046927SAndroid Build Coastguard Worker const VkVideoDecodeH265DpbSlotInfoKHR *dpb_slot_info =
906*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pReferenceSlots[i].pNext, VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR);
907*61046927SAndroid Build Coastguard Worker if (frame_info->pReferenceSlots[i].slotIndex == slot)
908*61046927SAndroid Build Coastguard Worker return dpb_slot_info->pStdReferenceInfo->PicOrderCntVal;
909*61046927SAndroid Build Coastguard Worker }
910*61046927SAndroid Build Coastguard Worker
911*61046927SAndroid Build Coastguard Worker assert(0);
912*61046927SAndroid Build Coastguard Worker
913*61046927SAndroid Build Coastguard Worker return 0;
914*61046927SAndroid Build Coastguard Worker }
915*61046927SAndroid Build Coastguard Worker
916*61046927SAndroid Build Coastguard Worker void
vk_fill_video_h265_reference_info(const VkVideoDecodeInfoKHR * frame_info,const struct VkVideoDecodeH265PictureInfoKHR * pic,const struct vk_video_h265_slice_params * slice_params,struct vk_video_h265_reference ref_slots[][8])917*61046927SAndroid Build Coastguard Worker vk_fill_video_h265_reference_info(const VkVideoDecodeInfoKHR *frame_info,
918*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265PictureInfoKHR *pic,
919*61046927SAndroid Build Coastguard Worker const struct vk_video_h265_slice_params *slice_params,
920*61046927SAndroid Build Coastguard Worker struct vk_video_h265_reference ref_slots[][8])
921*61046927SAndroid Build Coastguard Worker {
922*61046927SAndroid Build Coastguard Worker uint8_t list_cnt = slice_params->slice_type == STD_VIDEO_H265_SLICE_TYPE_B ? 2 : 1;
923*61046927SAndroid Build Coastguard Worker uint8_t list_idx;
924*61046927SAndroid Build Coastguard Worker int i, j;
925*61046927SAndroid Build Coastguard Worker
926*61046927SAndroid Build Coastguard Worker for (list_idx = 0; list_idx < list_cnt; list_idx++) {
927*61046927SAndroid Build Coastguard Worker /* The order is
928*61046927SAndroid Build Coastguard Worker * L0: Short term current before set - Short term current after set - long term current
929*61046927SAndroid Build Coastguard Worker * L1: Short term current after set - short term current before set - long term current
930*61046927SAndroid Build Coastguard Worker */
931*61046927SAndroid Build Coastguard Worker const uint8_t *rps[3] = {
932*61046927SAndroid Build Coastguard Worker list_idx ? pic->pStdPictureInfo->RefPicSetStCurrAfter : pic->pStdPictureInfo->RefPicSetStCurrBefore,
933*61046927SAndroid Build Coastguard Worker list_idx ? pic->pStdPictureInfo->RefPicSetStCurrBefore : pic->pStdPictureInfo->RefPicSetStCurrAfter,
934*61046927SAndroid Build Coastguard Worker pic->pStdPictureInfo->RefPicSetLtCurr
935*61046927SAndroid Build Coastguard Worker };
936*61046927SAndroid Build Coastguard Worker
937*61046927SAndroid Build Coastguard Worker uint8_t ref_idx = 0;
938*61046927SAndroid Build Coastguard Worker for (i = 0; i < 3; i++) {
939*61046927SAndroid Build Coastguard Worker const uint8_t *cur_rps = rps[i];
940*61046927SAndroid Build Coastguard Worker
941*61046927SAndroid Build Coastguard Worker for (j = 0; (cur_rps[j] != 0xff) && ((j + ref_idx) < 8); j++) {
942*61046927SAndroid Build Coastguard Worker ref_slots[list_idx][j + ref_idx].slot_index = cur_rps[j];
943*61046927SAndroid Build Coastguard Worker ref_slots[list_idx][j + ref_idx].pic_order_cnt = vk_video_h265_poc_by_slot(frame_info, cur_rps[j]);
944*61046927SAndroid Build Coastguard Worker }
945*61046927SAndroid Build Coastguard Worker ref_idx += j;
946*61046927SAndroid Build Coastguard Worker }
947*61046927SAndroid Build Coastguard Worker
948*61046927SAndroid Build Coastguard Worker /* TODO: should handle cases where rpl_modification_flag is true. */
949*61046927SAndroid Build Coastguard Worker assert(!slice_params->rpl_modification_flag[0] && !slice_params->rpl_modification_flag[1]);
950*61046927SAndroid Build Coastguard Worker }
951*61046927SAndroid Build Coastguard Worker }
952*61046927SAndroid Build Coastguard Worker
953*61046927SAndroid Build Coastguard Worker static void
h265_pred_weight_table(struct vk_video_h265_slice_params * params,struct vl_rbsp * rbsp,const StdVideoH265SequenceParameterSet * sps,StdVideoH265SliceType slice_type)954*61046927SAndroid Build Coastguard Worker h265_pred_weight_table(struct vk_video_h265_slice_params *params,
955*61046927SAndroid Build Coastguard Worker struct vl_rbsp *rbsp,
956*61046927SAndroid Build Coastguard Worker const StdVideoH265SequenceParameterSet *sps,
957*61046927SAndroid Build Coastguard Worker StdVideoH265SliceType slice_type)
958*61046927SAndroid Build Coastguard Worker {
959*61046927SAndroid Build Coastguard Worker unsigned chroma_array_type = sps->flags.separate_colour_plane_flag ? 0 : sps->chroma_format_idc;
960*61046927SAndroid Build Coastguard Worker unsigned i, j;
961*61046927SAndroid Build Coastguard Worker
962*61046927SAndroid Build Coastguard Worker params->luma_log2_weight_denom = vl_rbsp_ue(rbsp);
963*61046927SAndroid Build Coastguard Worker
964*61046927SAndroid Build Coastguard Worker assert(params->luma_log2_weight_denom >= 0 && params->luma_log2_weight_denom < 8);
965*61046927SAndroid Build Coastguard Worker
966*61046927SAndroid Build Coastguard Worker if (chroma_array_type != 0) {
967*61046927SAndroid Build Coastguard Worker params->chroma_log2_weight_denom = params->luma_log2_weight_denom + vl_rbsp_se(rbsp);
968*61046927SAndroid Build Coastguard Worker assert(params->chroma_log2_weight_denom >= 0 && params->chroma_log2_weight_denom < 8);
969*61046927SAndroid Build Coastguard Worker }
970*61046927SAndroid Build Coastguard Worker
971*61046927SAndroid Build Coastguard Worker for (i = 0; i < params->num_ref_idx_l0_active; ++i) {
972*61046927SAndroid Build Coastguard Worker params->luma_weight_l0_flag[i] = vl_rbsp_u(rbsp, 1);
973*61046927SAndroid Build Coastguard Worker if (!params->luma_weight_l0_flag[i]) {
974*61046927SAndroid Build Coastguard Worker params->luma_weight_l0[i] = 1 << params->luma_log2_weight_denom;
975*61046927SAndroid Build Coastguard Worker params->luma_offset_l0[i] = 0;
976*61046927SAndroid Build Coastguard Worker }
977*61046927SAndroid Build Coastguard Worker }
978*61046927SAndroid Build Coastguard Worker
979*61046927SAndroid Build Coastguard Worker for (i = 0; i < params->num_ref_idx_l0_active; ++i) {
980*61046927SAndroid Build Coastguard Worker if (chroma_array_type == 0) {
981*61046927SAndroid Build Coastguard Worker params->chroma_weight_l0_flag[i] = 0;
982*61046927SAndroid Build Coastguard Worker } else {
983*61046927SAndroid Build Coastguard Worker params->chroma_weight_l0_flag[i] = vl_rbsp_u(rbsp, 1);
984*61046927SAndroid Build Coastguard Worker }
985*61046927SAndroid Build Coastguard Worker }
986*61046927SAndroid Build Coastguard Worker
987*61046927SAndroid Build Coastguard Worker for (i = 0; i < params->num_ref_idx_l0_active; ++i) {
988*61046927SAndroid Build Coastguard Worker if (params->luma_weight_l0_flag[i]) {
989*61046927SAndroid Build Coastguard Worker params->delta_luma_weight_l0[i] = vl_rbsp_se(rbsp);
990*61046927SAndroid Build Coastguard Worker params->luma_weight_l0[i] = (1 << params->luma_log2_weight_denom) + params->delta_luma_weight_l0[i];
991*61046927SAndroid Build Coastguard Worker params->luma_offset_l0[i] = vl_rbsp_se(rbsp);
992*61046927SAndroid Build Coastguard Worker }
993*61046927SAndroid Build Coastguard Worker
994*61046927SAndroid Build Coastguard Worker if (params->chroma_weight_l0_flag[i]) {
995*61046927SAndroid Build Coastguard Worker for (j = 0; j < 2; j++) {
996*61046927SAndroid Build Coastguard Worker params->delta_chroma_weight_l0[i][j] = vl_rbsp_se(rbsp);
997*61046927SAndroid Build Coastguard Worker params->delta_chroma_offset_l0[i][j] = vl_rbsp_se(rbsp);
998*61046927SAndroid Build Coastguard Worker
999*61046927SAndroid Build Coastguard Worker params->chroma_weight_l0[i][j] =
1000*61046927SAndroid Build Coastguard Worker (1 << params->chroma_log2_weight_denom) + params->delta_chroma_weight_l0[i][j];
1001*61046927SAndroid Build Coastguard Worker params->chroma_offset_l0[i][j] = CLAMP(params->delta_chroma_offset_l0[i][j] -
1002*61046927SAndroid Build Coastguard Worker ((128 * params->chroma_weight_l0[i][j]) >> params->chroma_log2_weight_denom) + 128, -128, 127);
1003*61046927SAndroid Build Coastguard Worker }
1004*61046927SAndroid Build Coastguard Worker } else {
1005*61046927SAndroid Build Coastguard Worker for (j = 0; j < 2; j++) {
1006*61046927SAndroid Build Coastguard Worker params->chroma_weight_l0[i][j] = 1 << params->chroma_log2_weight_denom;
1007*61046927SAndroid Build Coastguard Worker params->chroma_offset_l0[i][j] = 0;
1008*61046927SAndroid Build Coastguard Worker }
1009*61046927SAndroid Build Coastguard Worker }
1010*61046927SAndroid Build Coastguard Worker }
1011*61046927SAndroid Build Coastguard Worker
1012*61046927SAndroid Build Coastguard Worker if (slice_type == STD_VIDEO_H265_SLICE_TYPE_B) {
1013*61046927SAndroid Build Coastguard Worker for (i = 0; i < params->num_ref_idx_l1_active; ++i) {
1014*61046927SAndroid Build Coastguard Worker params->luma_weight_l1_flag[i] = vl_rbsp_u(rbsp, 1);
1015*61046927SAndroid Build Coastguard Worker if (!params->luma_weight_l1_flag[i]) {
1016*61046927SAndroid Build Coastguard Worker params->luma_weight_l1[i] = 1 << params->luma_log2_weight_denom;
1017*61046927SAndroid Build Coastguard Worker params->luma_offset_l1[i] = 0;
1018*61046927SAndroid Build Coastguard Worker }
1019*61046927SAndroid Build Coastguard Worker }
1020*61046927SAndroid Build Coastguard Worker
1021*61046927SAndroid Build Coastguard Worker for (i = 0; i < params->num_ref_idx_l1_active; ++i) {
1022*61046927SAndroid Build Coastguard Worker if (chroma_array_type == 0) {
1023*61046927SAndroid Build Coastguard Worker params->chroma_weight_l1_flag[i] = 0;
1024*61046927SAndroid Build Coastguard Worker } else {
1025*61046927SAndroid Build Coastguard Worker params->chroma_weight_l1_flag[i] = vl_rbsp_u(rbsp, 1);
1026*61046927SAndroid Build Coastguard Worker }
1027*61046927SAndroid Build Coastguard Worker }
1028*61046927SAndroid Build Coastguard Worker
1029*61046927SAndroid Build Coastguard Worker for (i = 0; i < params->num_ref_idx_l1_active; ++i) {
1030*61046927SAndroid Build Coastguard Worker if (params->luma_weight_l1_flag[i]) {
1031*61046927SAndroid Build Coastguard Worker params->delta_luma_weight_l1[i] = vl_rbsp_se(rbsp);
1032*61046927SAndroid Build Coastguard Worker params->luma_weight_l1[i] =
1033*61046927SAndroid Build Coastguard Worker (1 << params->luma_log2_weight_denom) + params->delta_luma_weight_l1[i];
1034*61046927SAndroid Build Coastguard Worker params->luma_offset_l1[i] = vl_rbsp_se(rbsp);
1035*61046927SAndroid Build Coastguard Worker }
1036*61046927SAndroid Build Coastguard Worker
1037*61046927SAndroid Build Coastguard Worker if (params->chroma_weight_l1_flag[i]) {
1038*61046927SAndroid Build Coastguard Worker for (j = 0; j < 2; j++) {
1039*61046927SAndroid Build Coastguard Worker params->delta_chroma_weight_l1[i][j] = vl_rbsp_se(rbsp);
1040*61046927SAndroid Build Coastguard Worker params->delta_chroma_offset_l1[i][j] = vl_rbsp_se(rbsp);
1041*61046927SAndroid Build Coastguard Worker
1042*61046927SAndroid Build Coastguard Worker params->chroma_weight_l1[i][j] =
1043*61046927SAndroid Build Coastguard Worker (1 << params->chroma_log2_weight_denom) + params->delta_chroma_weight_l1[i][j];
1044*61046927SAndroid Build Coastguard Worker params->chroma_offset_l1[i][j] = CLAMP(params->delta_chroma_offset_l1[i][j] -
1045*61046927SAndroid Build Coastguard Worker ((128 * params->chroma_weight_l1[i][j]) >> params->chroma_log2_weight_denom) + 128, -128, 127);
1046*61046927SAndroid Build Coastguard Worker }
1047*61046927SAndroid Build Coastguard Worker } else {
1048*61046927SAndroid Build Coastguard Worker for (j = 0; j < 2; j++) {
1049*61046927SAndroid Build Coastguard Worker params->chroma_weight_l1[i][j] = 1 << params->chroma_log2_weight_denom;
1050*61046927SAndroid Build Coastguard Worker params->chroma_offset_l1[i][j] = 0;
1051*61046927SAndroid Build Coastguard Worker }
1052*61046927SAndroid Build Coastguard Worker }
1053*61046927SAndroid Build Coastguard Worker }
1054*61046927SAndroid Build Coastguard Worker }
1055*61046927SAndroid Build Coastguard Worker }
1056*61046927SAndroid Build Coastguard Worker
1057*61046927SAndroid Build Coastguard Worker void
vk_video_parse_h265_slice_header(const struct VkVideoDecodeInfoKHR * frame_info,const VkVideoDecodeH265PictureInfoKHR * pic_info,const StdVideoH265SequenceParameterSet * sps,const StdVideoH265PictureParameterSet * pps,void * slice_data,uint32_t slice_size,struct vk_video_h265_slice_params * params)1058*61046927SAndroid Build Coastguard Worker vk_video_parse_h265_slice_header(const struct VkVideoDecodeInfoKHR *frame_info,
1059*61046927SAndroid Build Coastguard Worker const VkVideoDecodeH265PictureInfoKHR *pic_info,
1060*61046927SAndroid Build Coastguard Worker const StdVideoH265SequenceParameterSet *sps,
1061*61046927SAndroid Build Coastguard Worker const StdVideoH265PictureParameterSet *pps,
1062*61046927SAndroid Build Coastguard Worker void *slice_data,
1063*61046927SAndroid Build Coastguard Worker uint32_t slice_size,
1064*61046927SAndroid Build Coastguard Worker struct vk_video_h265_slice_params *params)
1065*61046927SAndroid Build Coastguard Worker {
1066*61046927SAndroid Build Coastguard Worker struct vl_vlc vlc;
1067*61046927SAndroid Build Coastguard Worker const void *slice_headers[1] = { slice_data };
1068*61046927SAndroid Build Coastguard Worker vl_vlc_init(&vlc, 1, slice_headers, &slice_size);
1069*61046927SAndroid Build Coastguard Worker
1070*61046927SAndroid Build Coastguard Worker assert(vl_vlc_peekbits(&vlc, 24) == 0x000001);
1071*61046927SAndroid Build Coastguard Worker
1072*61046927SAndroid Build Coastguard Worker vl_vlc_eatbits(&vlc, 24);
1073*61046927SAndroid Build Coastguard Worker
1074*61046927SAndroid Build Coastguard Worker /* forbidden_zero_bit */
1075*61046927SAndroid Build Coastguard Worker vl_vlc_eatbits(&vlc, 1);
1076*61046927SAndroid Build Coastguard Worker
1077*61046927SAndroid Build Coastguard Worker if (vl_vlc_valid_bits(&vlc) < 15)
1078*61046927SAndroid Build Coastguard Worker vl_vlc_fillbits(&vlc);
1079*61046927SAndroid Build Coastguard Worker
1080*61046927SAndroid Build Coastguard Worker vl_vlc_get_uimsbf(&vlc, 6); /* nal_unit_type */
1081*61046927SAndroid Build Coastguard Worker vl_vlc_get_uimsbf(&vlc, 6); /* nuh_layer_id */
1082*61046927SAndroid Build Coastguard Worker vl_vlc_get_uimsbf(&vlc, 3); /* nuh_temporal_id_plus1 */
1083*61046927SAndroid Build Coastguard Worker
1084*61046927SAndroid Build Coastguard Worker struct vl_rbsp rbsp;
1085*61046927SAndroid Build Coastguard Worker vl_rbsp_init(&rbsp, &vlc, 128, /* emulation_bytes */ true);
1086*61046927SAndroid Build Coastguard Worker
1087*61046927SAndroid Build Coastguard Worker memset(params, 0, sizeof(*params));
1088*61046927SAndroid Build Coastguard Worker
1089*61046927SAndroid Build Coastguard Worker params->slice_size = slice_size;
1090*61046927SAndroid Build Coastguard Worker params->first_slice_segment_in_pic_flag = vl_rbsp_u(&rbsp, 1);
1091*61046927SAndroid Build Coastguard Worker
1092*61046927SAndroid Build Coastguard Worker /* no_output_of_prior_pics_flag */
1093*61046927SAndroid Build Coastguard Worker if (pic_info->pStdPictureInfo->flags.IrapPicFlag)
1094*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 1);
1095*61046927SAndroid Build Coastguard Worker
1096*61046927SAndroid Build Coastguard Worker /* pps id */
1097*61046927SAndroid Build Coastguard Worker vl_rbsp_ue(&rbsp);
1098*61046927SAndroid Build Coastguard Worker
1099*61046927SAndroid Build Coastguard Worker if (!params->first_slice_segment_in_pic_flag) {
1100*61046927SAndroid Build Coastguard Worker int size, num;
1101*61046927SAndroid Build Coastguard Worker int bits_slice_segment_address = 0;
1102*61046927SAndroid Build Coastguard Worker
1103*61046927SAndroid Build Coastguard Worker if (pps->flags.dependent_slice_segments_enabled_flag)
1104*61046927SAndroid Build Coastguard Worker params->dependent_slice_segment = vl_rbsp_u(&rbsp, 1);
1105*61046927SAndroid Build Coastguard Worker
1106*61046927SAndroid Build Coastguard Worker size = 1 << (sps->log2_min_luma_coding_block_size_minus3 + 3 +
1107*61046927SAndroid Build Coastguard Worker sps->log2_diff_max_min_luma_coding_block_size);
1108*61046927SAndroid Build Coastguard Worker
1109*61046927SAndroid Build Coastguard Worker num = ((sps->pic_width_in_luma_samples + size - 1) / size) *
1110*61046927SAndroid Build Coastguard Worker ((sps->pic_height_in_luma_samples + size - 1) / size);
1111*61046927SAndroid Build Coastguard Worker
1112*61046927SAndroid Build Coastguard Worker while (num > (1 << bits_slice_segment_address))
1113*61046927SAndroid Build Coastguard Worker bits_slice_segment_address++;
1114*61046927SAndroid Build Coastguard Worker
1115*61046927SAndroid Build Coastguard Worker /* slice_segment_address */
1116*61046927SAndroid Build Coastguard Worker params->slice_segment_address = vl_rbsp_u(&rbsp, bits_slice_segment_address);
1117*61046927SAndroid Build Coastguard Worker }
1118*61046927SAndroid Build Coastguard Worker
1119*61046927SAndroid Build Coastguard Worker if (params->dependent_slice_segment)
1120*61046927SAndroid Build Coastguard Worker return;
1121*61046927SAndroid Build Coastguard Worker
1122*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < pps->num_extra_slice_header_bits; ++i)
1123*61046927SAndroid Build Coastguard Worker /* slice_reserved_flag */
1124*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 1);
1125*61046927SAndroid Build Coastguard Worker
1126*61046927SAndroid Build Coastguard Worker /* slice_type */
1127*61046927SAndroid Build Coastguard Worker params->slice_type = vl_rbsp_ue(&rbsp);
1128*61046927SAndroid Build Coastguard Worker
1129*61046927SAndroid Build Coastguard Worker if (pps->flags.output_flag_present_flag)
1130*61046927SAndroid Build Coastguard Worker /* pic output flag */
1131*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 1);
1132*61046927SAndroid Build Coastguard Worker
1133*61046927SAndroid Build Coastguard Worker if (sps->flags.separate_colour_plane_flag)
1134*61046927SAndroid Build Coastguard Worker /* colour_plane_id */
1135*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 2);
1136*61046927SAndroid Build Coastguard Worker
1137*61046927SAndroid Build Coastguard Worker if (!pic_info->pStdPictureInfo->flags.IdrPicFlag) {
1138*61046927SAndroid Build Coastguard Worker /* slice_pic_order_cnt_lsb */
1139*61046927SAndroid Build Coastguard Worker params->pic_order_cnt_lsb =
1140*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
1141*61046927SAndroid Build Coastguard Worker
1142*61046927SAndroid Build Coastguard Worker /* short_term_ref_pic_set_sps_flag */
1143*61046927SAndroid Build Coastguard Worker if (!vl_rbsp_u(&rbsp, 1)) {
1144*61046927SAndroid Build Coastguard Worker uint8_t rps_predict = 0;
1145*61046927SAndroid Build Coastguard Worker
1146*61046927SAndroid Build Coastguard Worker if (sps->num_short_term_ref_pic_sets)
1147*61046927SAndroid Build Coastguard Worker rps_predict = vl_rbsp_u(&rbsp, 1);
1148*61046927SAndroid Build Coastguard Worker
1149*61046927SAndroid Build Coastguard Worker if (rps_predict) {
1150*61046927SAndroid Build Coastguard Worker /* delta_idx */
1151*61046927SAndroid Build Coastguard Worker vl_rbsp_ue(&rbsp);
1152*61046927SAndroid Build Coastguard Worker /* delta_rps_sign */
1153*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 1);
1154*61046927SAndroid Build Coastguard Worker /* abs_delta_rps */
1155*61046927SAndroid Build Coastguard Worker vl_rbsp_ue(&rbsp);
1156*61046927SAndroid Build Coastguard Worker
1157*61046927SAndroid Build Coastguard Worker for (int i = 0 ; i <= pic_info->pStdPictureInfo->NumDeltaPocsOfRefRpsIdx; i++) {
1158*61046927SAndroid Build Coastguard Worker uint8_t used = vl_rbsp_u(&rbsp, 1);
1159*61046927SAndroid Build Coastguard Worker if (!used)
1160*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 1);
1161*61046927SAndroid Build Coastguard Worker }
1162*61046927SAndroid Build Coastguard Worker } else {
1163*61046927SAndroid Build Coastguard Worker /* num_negative_pics */
1164*61046927SAndroid Build Coastguard Worker unsigned num_neg_pics = vl_rbsp_ue(&rbsp);
1165*61046927SAndroid Build Coastguard Worker /* num_positive_pics */
1166*61046927SAndroid Build Coastguard Worker unsigned num_pos_pics = vl_rbsp_ue(&rbsp);
1167*61046927SAndroid Build Coastguard Worker
1168*61046927SAndroid Build Coastguard Worker for(unsigned i = 0 ; i < num_neg_pics; ++i) {
1169*61046927SAndroid Build Coastguard Worker /* delta_poc_s0_minus1 */
1170*61046927SAndroid Build Coastguard Worker vl_rbsp_ue(&rbsp);
1171*61046927SAndroid Build Coastguard Worker /* used_by_curr_pic_s0_flag */
1172*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 1);
1173*61046927SAndroid Build Coastguard Worker }
1174*61046927SAndroid Build Coastguard Worker
1175*61046927SAndroid Build Coastguard Worker for(unsigned i = 0; i < num_pos_pics; ++i) {
1176*61046927SAndroid Build Coastguard Worker /* delta_poc_s1_minus1 */
1177*61046927SAndroid Build Coastguard Worker vl_rbsp_ue(&rbsp);
1178*61046927SAndroid Build Coastguard Worker /* used_by_curr_pic_s0_flag */
1179*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 1);
1180*61046927SAndroid Build Coastguard Worker }
1181*61046927SAndroid Build Coastguard Worker }
1182*61046927SAndroid Build Coastguard Worker
1183*61046927SAndroid Build Coastguard Worker } else {
1184*61046927SAndroid Build Coastguard Worker unsigned num_st_rps = sps->num_short_term_ref_pic_sets;
1185*61046927SAndroid Build Coastguard Worker
1186*61046927SAndroid Build Coastguard Worker int numbits = util_logbase2_ceil(num_st_rps);
1187*61046927SAndroid Build Coastguard Worker if (numbits > 0)
1188*61046927SAndroid Build Coastguard Worker /* short_term_ref_pic_set_idx */
1189*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, numbits);
1190*61046927SAndroid Build Coastguard Worker }
1191*61046927SAndroid Build Coastguard Worker
1192*61046927SAndroid Build Coastguard Worker if (sps->flags.long_term_ref_pics_present_flag) {
1193*61046927SAndroid Build Coastguard Worker unsigned num_lt_sps = 0;
1194*61046927SAndroid Build Coastguard Worker
1195*61046927SAndroid Build Coastguard Worker if (sps->num_long_term_ref_pics_sps > 0)
1196*61046927SAndroid Build Coastguard Worker num_lt_sps = vl_rbsp_ue(&rbsp);
1197*61046927SAndroid Build Coastguard Worker
1198*61046927SAndroid Build Coastguard Worker unsigned num_lt_pics = vl_rbsp_ue(&rbsp);
1199*61046927SAndroid Build Coastguard Worker unsigned num_refs = num_lt_pics + num_lt_sps;
1200*61046927SAndroid Build Coastguard Worker
1201*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_refs; i++) {
1202*61046927SAndroid Build Coastguard Worker if (i < num_lt_sps) {
1203*61046927SAndroid Build Coastguard Worker if (sps->num_long_term_ref_pics_sps > 1)
1204*61046927SAndroid Build Coastguard Worker /* lt_idx_sps */
1205*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp,
1206*61046927SAndroid Build Coastguard Worker util_logbase2_ceil(sps->num_long_term_ref_pics_sps));
1207*61046927SAndroid Build Coastguard Worker } else {
1208*61046927SAndroid Build Coastguard Worker /* poc_lsb_lt */
1209*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
1210*61046927SAndroid Build Coastguard Worker /* used_by_curr_pic_lt_flag */
1211*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 1);
1212*61046927SAndroid Build Coastguard Worker }
1213*61046927SAndroid Build Coastguard Worker
1214*61046927SAndroid Build Coastguard Worker /* poc_msb_present */
1215*61046927SAndroid Build Coastguard Worker if (vl_rbsp_u(&rbsp, 1)) {
1216*61046927SAndroid Build Coastguard Worker /* delta_poc_msb_cycle_lt */
1217*61046927SAndroid Build Coastguard Worker vl_rbsp_ue(&rbsp);
1218*61046927SAndroid Build Coastguard Worker }
1219*61046927SAndroid Build Coastguard Worker }
1220*61046927SAndroid Build Coastguard Worker }
1221*61046927SAndroid Build Coastguard Worker
1222*61046927SAndroid Build Coastguard Worker if (sps->flags.sps_temporal_mvp_enabled_flag)
1223*61046927SAndroid Build Coastguard Worker params->temporal_mvp_enable = vl_rbsp_u(&rbsp, 1);
1224*61046927SAndroid Build Coastguard Worker }
1225*61046927SAndroid Build Coastguard Worker
1226*61046927SAndroid Build Coastguard Worker if (sps->flags.sample_adaptive_offset_enabled_flag) {
1227*61046927SAndroid Build Coastguard Worker params->sao_luma_flag = vl_rbsp_u(&rbsp, 1);
1228*61046927SAndroid Build Coastguard Worker if (sps->chroma_format_idc)
1229*61046927SAndroid Build Coastguard Worker params->sao_chroma_flag = vl_rbsp_u(&rbsp, 1);
1230*61046927SAndroid Build Coastguard Worker }
1231*61046927SAndroid Build Coastguard Worker
1232*61046927SAndroid Build Coastguard Worker params->max_num_merge_cand = 5;
1233*61046927SAndroid Build Coastguard Worker
1234*61046927SAndroid Build Coastguard Worker if (params->slice_type != STD_VIDEO_H265_SLICE_TYPE_I) {
1235*61046927SAndroid Build Coastguard Worker
1236*61046927SAndroid Build Coastguard Worker params->num_ref_idx_l0_active = pps->num_ref_idx_l0_default_active_minus1 + 1;
1237*61046927SAndroid Build Coastguard Worker
1238*61046927SAndroid Build Coastguard Worker if (params->slice_type == STD_VIDEO_H265_SLICE_TYPE_B)
1239*61046927SAndroid Build Coastguard Worker params->num_ref_idx_l1_active = pps->num_ref_idx_l1_default_active_minus1 + 1;
1240*61046927SAndroid Build Coastguard Worker else
1241*61046927SAndroid Build Coastguard Worker params->num_ref_idx_l1_active = 0;
1242*61046927SAndroid Build Coastguard Worker
1243*61046927SAndroid Build Coastguard Worker /* num_ref_idx_active_override_flag */
1244*61046927SAndroid Build Coastguard Worker if (vl_rbsp_u(&rbsp, 1)) {
1245*61046927SAndroid Build Coastguard Worker params->num_ref_idx_l0_active = vl_rbsp_ue(&rbsp) + 1;
1246*61046927SAndroid Build Coastguard Worker if (params->slice_type == STD_VIDEO_H265_SLICE_TYPE_B)
1247*61046927SAndroid Build Coastguard Worker params->num_ref_idx_l1_active = vl_rbsp_ue(&rbsp) + 1;
1248*61046927SAndroid Build Coastguard Worker }
1249*61046927SAndroid Build Coastguard Worker
1250*61046927SAndroid Build Coastguard Worker if (pps->flags.lists_modification_present_flag) {
1251*61046927SAndroid Build Coastguard Worker params->rpl_modification_flag[0] = vl_rbsp_u(&rbsp, 1);
1252*61046927SAndroid Build Coastguard Worker if (params->rpl_modification_flag[0]) {
1253*61046927SAndroid Build Coastguard Worker for (int i = 0; i < params->num_ref_idx_l0_active; i++) {
1254*61046927SAndroid Build Coastguard Worker /* list_entry_l0 */
1255*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp,
1256*61046927SAndroid Build Coastguard Worker util_logbase2_ceil(params->num_ref_idx_l0_active + params->num_ref_idx_l1_active));
1257*61046927SAndroid Build Coastguard Worker }
1258*61046927SAndroid Build Coastguard Worker }
1259*61046927SAndroid Build Coastguard Worker
1260*61046927SAndroid Build Coastguard Worker if (params->slice_type == STD_VIDEO_H265_SLICE_TYPE_B) {
1261*61046927SAndroid Build Coastguard Worker params->rpl_modification_flag[1] = vl_rbsp_u(&rbsp, 1);
1262*61046927SAndroid Build Coastguard Worker if (params->rpl_modification_flag[1]) {
1263*61046927SAndroid Build Coastguard Worker for (int i = 0; i < params->num_ref_idx_l1_active; i++) {
1264*61046927SAndroid Build Coastguard Worker /* list_entry_l1 */
1265*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp,
1266*61046927SAndroid Build Coastguard Worker util_logbase2_ceil(params->num_ref_idx_l0_active + params->num_ref_idx_l1_active));
1267*61046927SAndroid Build Coastguard Worker }
1268*61046927SAndroid Build Coastguard Worker }
1269*61046927SAndroid Build Coastguard Worker }
1270*61046927SAndroid Build Coastguard Worker }
1271*61046927SAndroid Build Coastguard Worker
1272*61046927SAndroid Build Coastguard Worker if (params->slice_type == STD_VIDEO_H265_SLICE_TYPE_B)
1273*61046927SAndroid Build Coastguard Worker params->mvd_l1_zero_flag = vl_rbsp_u(&rbsp, 1);
1274*61046927SAndroid Build Coastguard Worker
1275*61046927SAndroid Build Coastguard Worker if (pps->flags.cabac_init_present_flag)
1276*61046927SAndroid Build Coastguard Worker /* cabac_init_flag */
1277*61046927SAndroid Build Coastguard Worker params->cabac_init_idc = vl_rbsp_u(&rbsp, 1);
1278*61046927SAndroid Build Coastguard Worker
1279*61046927SAndroid Build Coastguard Worker if (params->temporal_mvp_enable) {
1280*61046927SAndroid Build Coastguard Worker if (params->slice_type == STD_VIDEO_H265_SLICE_TYPE_B)
1281*61046927SAndroid Build Coastguard Worker params->collocated_list = !vl_rbsp_u(&rbsp, 1);
1282*61046927SAndroid Build Coastguard Worker
1283*61046927SAndroid Build Coastguard Worker if (params->collocated_list == 0) {
1284*61046927SAndroid Build Coastguard Worker if (params->num_ref_idx_l0_active > 1)
1285*61046927SAndroid Build Coastguard Worker params->collocated_ref_idx = vl_rbsp_ue(&rbsp);
1286*61046927SAndroid Build Coastguard Worker } else if (params->collocated_list == 1) {
1287*61046927SAndroid Build Coastguard Worker if (params->num_ref_idx_l1_active > 1)
1288*61046927SAndroid Build Coastguard Worker params->collocated_ref_idx = vl_rbsp_ue(&rbsp);
1289*61046927SAndroid Build Coastguard Worker }
1290*61046927SAndroid Build Coastguard Worker }
1291*61046927SAndroid Build Coastguard Worker
1292*61046927SAndroid Build Coastguard Worker if ((pps->flags.weighted_pred_flag && params->slice_type == STD_VIDEO_H265_SLICE_TYPE_P) ||
1293*61046927SAndroid Build Coastguard Worker (pps->flags.weighted_bipred_flag && params->slice_type == STD_VIDEO_H265_SLICE_TYPE_B)) {
1294*61046927SAndroid Build Coastguard Worker h265_pred_weight_table(params, &rbsp, sps, params->slice_type);
1295*61046927SAndroid Build Coastguard Worker }
1296*61046927SAndroid Build Coastguard Worker
1297*61046927SAndroid Build Coastguard Worker params->max_num_merge_cand -= vl_rbsp_ue(&rbsp);
1298*61046927SAndroid Build Coastguard Worker }
1299*61046927SAndroid Build Coastguard Worker
1300*61046927SAndroid Build Coastguard Worker params->slice_qp_delta = vl_rbsp_se(&rbsp);
1301*61046927SAndroid Build Coastguard Worker
1302*61046927SAndroid Build Coastguard Worker if (pps->flags.pps_slice_chroma_qp_offsets_present_flag) {
1303*61046927SAndroid Build Coastguard Worker params->slice_cb_qp_offset = vl_rbsp_se(&rbsp);
1304*61046927SAndroid Build Coastguard Worker params->slice_cr_qp_offset = vl_rbsp_se(&rbsp);
1305*61046927SAndroid Build Coastguard Worker }
1306*61046927SAndroid Build Coastguard Worker
1307*61046927SAndroid Build Coastguard Worker if (pps->flags.chroma_qp_offset_list_enabled_flag)
1308*61046927SAndroid Build Coastguard Worker /* cu_chroma_qp_offset_enabled_flag */
1309*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 1);
1310*61046927SAndroid Build Coastguard Worker
1311*61046927SAndroid Build Coastguard Worker if (pps->flags.deblocking_filter_control_present_flag) {
1312*61046927SAndroid Build Coastguard Worker if (pps->flags.deblocking_filter_override_enabled_flag) {
1313*61046927SAndroid Build Coastguard Worker /* deblocking_filter_override_flag */
1314*61046927SAndroid Build Coastguard Worker if (vl_rbsp_u(&rbsp, 1)) {
1315*61046927SAndroid Build Coastguard Worker params->disable_deblocking_filter_idc = vl_rbsp_u(&rbsp, 1);
1316*61046927SAndroid Build Coastguard Worker
1317*61046927SAndroid Build Coastguard Worker if (!params->disable_deblocking_filter_idc) {
1318*61046927SAndroid Build Coastguard Worker params->beta_offset_div2 = vl_rbsp_se(&rbsp);
1319*61046927SAndroid Build Coastguard Worker params->tc_offset_div2 = vl_rbsp_se(&rbsp);
1320*61046927SAndroid Build Coastguard Worker }
1321*61046927SAndroid Build Coastguard Worker } else {
1322*61046927SAndroid Build Coastguard Worker params->disable_deblocking_filter_idc =
1323*61046927SAndroid Build Coastguard Worker pps->flags.pps_deblocking_filter_disabled_flag;
1324*61046927SAndroid Build Coastguard Worker }
1325*61046927SAndroid Build Coastguard Worker }
1326*61046927SAndroid Build Coastguard Worker }
1327*61046927SAndroid Build Coastguard Worker
1328*61046927SAndroid Build Coastguard Worker if (pps->flags.pps_loop_filter_across_slices_enabled_flag &&
1329*61046927SAndroid Build Coastguard Worker (params->sao_luma_flag || params->sao_chroma_flag ||
1330*61046927SAndroid Build Coastguard Worker !params->disable_deblocking_filter_idc))
1331*61046927SAndroid Build Coastguard Worker params->loop_filter_across_slices_enable = vl_rbsp_u(&rbsp, 1);
1332*61046927SAndroid Build Coastguard Worker
1333*61046927SAndroid Build Coastguard Worker if (pps->flags.tiles_enabled_flag || pps->flags.entropy_coding_sync_enabled_flag) {
1334*61046927SAndroid Build Coastguard Worker unsigned num_entry_points_offsets = vl_rbsp_ue(&rbsp);
1335*61046927SAndroid Build Coastguard Worker
1336*61046927SAndroid Build Coastguard Worker if (num_entry_points_offsets > 0) {
1337*61046927SAndroid Build Coastguard Worker unsigned offset_len = vl_rbsp_ue(&rbsp) + 1;
1338*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_entry_points_offsets; i++) {
1339*61046927SAndroid Build Coastguard Worker /* entry_point_offset_minus1 */
1340*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, offset_len);
1341*61046927SAndroid Build Coastguard Worker }
1342*61046927SAndroid Build Coastguard Worker }
1343*61046927SAndroid Build Coastguard Worker }
1344*61046927SAndroid Build Coastguard Worker
1345*61046927SAndroid Build Coastguard Worker if (pps->flags.pps_extension_present_flag) {
1346*61046927SAndroid Build Coastguard Worker unsigned length = vl_rbsp_ue(&rbsp);
1347*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < length; i++)
1348*61046927SAndroid Build Coastguard Worker /* slice_reserved_undetermined_flag */
1349*61046927SAndroid Build Coastguard Worker vl_rbsp_u(&rbsp, 1);
1350*61046927SAndroid Build Coastguard Worker }
1351*61046927SAndroid Build Coastguard Worker
1352*61046927SAndroid Build Coastguard Worker unsigned header_bits =
1353*61046927SAndroid Build Coastguard Worker (slice_size * 8 - 24 /* start code */) - vl_vlc_bits_left(&rbsp.nal) - rbsp.removed;
1354*61046927SAndroid Build Coastguard Worker params->slice_data_bytes_offset = (header_bits + 8) / 8;
1355*61046927SAndroid Build Coastguard Worker }
1356*61046927SAndroid Build Coastguard Worker
1357*61046927SAndroid Build Coastguard Worker void
vk_video_get_profile_alignments(const VkVideoProfileListInfoKHR * profile_list,uint32_t * width_align_out,uint32_t * height_align_out)1358*61046927SAndroid Build Coastguard Worker vk_video_get_profile_alignments(const VkVideoProfileListInfoKHR *profile_list,
1359*61046927SAndroid Build Coastguard Worker uint32_t *width_align_out, uint32_t *height_align_out)
1360*61046927SAndroid Build Coastguard Worker {
1361*61046927SAndroid Build Coastguard Worker uint32_t width_align = 1, height_align = 1;
1362*61046927SAndroid Build Coastguard Worker
1363*61046927SAndroid Build Coastguard Worker if (!profile_list) {
1364*61046927SAndroid Build Coastguard Worker width_align = MAX2(width_align, VK_VIDEO_H264_MACROBLOCK_WIDTH);
1365*61046927SAndroid Build Coastguard Worker height_align = MAX2(height_align, VK_VIDEO_H264_MACROBLOCK_HEIGHT);
1366*61046927SAndroid Build Coastguard Worker width_align = MAX2(width_align, VK_VIDEO_H265_CTU_MAX_WIDTH);
1367*61046927SAndroid Build Coastguard Worker height_align = MAX2(height_align, VK_VIDEO_H265_CTU_MAX_HEIGHT);
1368*61046927SAndroid Build Coastguard Worker width_align = MAX2(width_align, VK_VIDEO_AV1_BLOCK_WIDTH);
1369*61046927SAndroid Build Coastguard Worker height_align = MAX2(height_align, VK_VIDEO_AV1_BLOCK_HEIGHT);
1370*61046927SAndroid Build Coastguard Worker } else {
1371*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < profile_list->profileCount; i++) {
1372*61046927SAndroid Build Coastguard Worker if (profile_list->pProfiles[i].videoCodecOperation == VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR ||
1373*61046927SAndroid Build Coastguard Worker profile_list->pProfiles[i].videoCodecOperation == VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR
1374*61046927SAndroid Build Coastguard Worker ) {
1375*61046927SAndroid Build Coastguard Worker width_align = MAX2(width_align, VK_VIDEO_H264_MACROBLOCK_WIDTH);
1376*61046927SAndroid Build Coastguard Worker height_align = MAX2(height_align, VK_VIDEO_H264_MACROBLOCK_HEIGHT);
1377*61046927SAndroid Build Coastguard Worker }
1378*61046927SAndroid Build Coastguard Worker if (profile_list->pProfiles[i].videoCodecOperation == VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR ||
1379*61046927SAndroid Build Coastguard Worker profile_list->pProfiles[i].videoCodecOperation == VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR
1380*61046927SAndroid Build Coastguard Worker ) {
1381*61046927SAndroid Build Coastguard Worker width_align = MAX2(width_align, VK_VIDEO_H265_CTU_MAX_WIDTH);
1382*61046927SAndroid Build Coastguard Worker height_align = MAX2(height_align, VK_VIDEO_H265_CTU_MAX_HEIGHT);
1383*61046927SAndroid Build Coastguard Worker }
1384*61046927SAndroid Build Coastguard Worker if (profile_list->pProfiles[i].videoCodecOperation == VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR) {
1385*61046927SAndroid Build Coastguard Worker width_align = MAX2(width_align, VK_VIDEO_AV1_BLOCK_WIDTH);
1386*61046927SAndroid Build Coastguard Worker height_align = MAX2(height_align, VK_VIDEO_AV1_BLOCK_HEIGHT);
1387*61046927SAndroid Build Coastguard Worker }
1388*61046927SAndroid Build Coastguard Worker }
1389*61046927SAndroid Build Coastguard Worker }
1390*61046927SAndroid Build Coastguard Worker *width_align_out = width_align;
1391*61046927SAndroid Build Coastguard Worker *height_align_out = height_align;
1392*61046927SAndroid Build Coastguard Worker }
1393*61046927SAndroid Build Coastguard Worker
1394*61046927SAndroid Build Coastguard Worker static const uint8_t vk_video_h264_levels[] = {10, 11, 12, 13, 20, 21, 22, 30, 31, 32, 40, 41, 42, 50, 51, 52, 60, 61, 62};
1395*61046927SAndroid Build Coastguard Worker uint8_t
vk_video_get_h264_level(StdVideoH264LevelIdc level)1396*61046927SAndroid Build Coastguard Worker vk_video_get_h264_level(StdVideoH264LevelIdc level)
1397*61046927SAndroid Build Coastguard Worker {
1398*61046927SAndroid Build Coastguard Worker assert(level <= STD_VIDEO_H264_LEVEL_IDC_6_2);
1399*61046927SAndroid Build Coastguard Worker return vk_video_h264_levels[level];
1400*61046927SAndroid Build Coastguard Worker }
1401*61046927SAndroid Build Coastguard Worker
1402*61046927SAndroid Build Coastguard Worker const StdVideoH264SequenceParameterSet *
vk_video_find_h264_enc_std_sps(const struct vk_video_session_parameters * params,uint32_t id)1403*61046927SAndroid Build Coastguard Worker vk_video_find_h264_enc_std_sps(const struct vk_video_session_parameters *params,
1404*61046927SAndroid Build Coastguard Worker uint32_t id)
1405*61046927SAndroid Build Coastguard Worker {
1406*61046927SAndroid Build Coastguard Worker return &find_h264_enc_h264_sps(params, id)->base;
1407*61046927SAndroid Build Coastguard Worker }
1408*61046927SAndroid Build Coastguard Worker
1409*61046927SAndroid Build Coastguard Worker const StdVideoH264PictureParameterSet *
vk_video_find_h264_enc_std_pps(const struct vk_video_session_parameters * params,uint32_t id)1410*61046927SAndroid Build Coastguard Worker vk_video_find_h264_enc_std_pps(const struct vk_video_session_parameters *params,
1411*61046927SAndroid Build Coastguard Worker uint32_t id)
1412*61046927SAndroid Build Coastguard Worker {
1413*61046927SAndroid Build Coastguard Worker return &find_h264_enc_h264_pps(params, id)->base;
1414*61046927SAndroid Build Coastguard Worker }
1415*61046927SAndroid Build Coastguard Worker
1416*61046927SAndroid Build Coastguard Worker const StdVideoH265VideoParameterSet *
vk_video_find_h265_enc_std_vps(const struct vk_video_session_parameters * params,uint32_t id)1417*61046927SAndroid Build Coastguard Worker vk_video_find_h265_enc_std_vps(const struct vk_video_session_parameters *params,
1418*61046927SAndroid Build Coastguard Worker uint32_t id)
1419*61046927SAndroid Build Coastguard Worker {
1420*61046927SAndroid Build Coastguard Worker return &find_h265_enc_h265_vps(params, id)->base;
1421*61046927SAndroid Build Coastguard Worker }
1422*61046927SAndroid Build Coastguard Worker
1423*61046927SAndroid Build Coastguard Worker const StdVideoH265SequenceParameterSet *
vk_video_find_h265_enc_std_sps(const struct vk_video_session_parameters * params,uint32_t id)1424*61046927SAndroid Build Coastguard Worker vk_video_find_h265_enc_std_sps(const struct vk_video_session_parameters *params,
1425*61046927SAndroid Build Coastguard Worker uint32_t id)
1426*61046927SAndroid Build Coastguard Worker {
1427*61046927SAndroid Build Coastguard Worker return &find_h265_enc_h265_sps(params, id)->base;
1428*61046927SAndroid Build Coastguard Worker }
1429*61046927SAndroid Build Coastguard Worker
1430*61046927SAndroid Build Coastguard Worker const StdVideoH265PictureParameterSet *
vk_video_find_h265_enc_std_pps(const struct vk_video_session_parameters * params,uint32_t id)1431*61046927SAndroid Build Coastguard Worker vk_video_find_h265_enc_std_pps(const struct vk_video_session_parameters *params,
1432*61046927SAndroid Build Coastguard Worker uint32_t id)
1433*61046927SAndroid Build Coastguard Worker {
1434*61046927SAndroid Build Coastguard Worker return &find_h265_enc_h265_pps(params, id)->base;
1435*61046927SAndroid Build Coastguard Worker }
1436*61046927SAndroid Build Coastguard Worker
1437*61046927SAndroid Build Coastguard Worker enum H264NALUType
1438*61046927SAndroid Build Coastguard Worker {
1439*61046927SAndroid Build Coastguard Worker H264_NAL_UNSPECIFIED = 0,
1440*61046927SAndroid Build Coastguard Worker H264_NAL_SLICE = 1,
1441*61046927SAndroid Build Coastguard Worker H264_NAL_SLICEDATA_A = 2,
1442*61046927SAndroid Build Coastguard Worker H264_NAL_SLICEDATA_B = 3,
1443*61046927SAndroid Build Coastguard Worker H264_NAL_SLICEDATA_C = 4,
1444*61046927SAndroid Build Coastguard Worker H264_NAL_IDR = 5,
1445*61046927SAndroid Build Coastguard Worker H264_NAL_SEI = 6,
1446*61046927SAndroid Build Coastguard Worker H264_NAL_SPS = 7,
1447*61046927SAndroid Build Coastguard Worker H264_NAL_PPS = 8,
1448*61046927SAndroid Build Coastguard Worker H264_NAL_ACCESS_UNIT_DEMILITER = 9,
1449*61046927SAndroid Build Coastguard Worker H264_NAL_END_OF_SEQUENCE = 10,
1450*61046927SAndroid Build Coastguard Worker H264_NAL_END_OF_STREAM = 11,
1451*61046927SAndroid Build Coastguard Worker H264_NAL_FILLER_DATA = 12,
1452*61046927SAndroid Build Coastguard Worker H264_NAL_SPS_EXTENSION = 13,
1453*61046927SAndroid Build Coastguard Worker H264_NAL_PREFIX = 14,
1454*61046927SAndroid Build Coastguard Worker /* 15...18 RESERVED */
1455*61046927SAndroid Build Coastguard Worker H264_NAL_AUXILIARY_SLICE = 19,
1456*61046927SAndroid Build Coastguard Worker /* 20...23 RESERVED */
1457*61046927SAndroid Build Coastguard Worker /* 24...31 UNSPECIFIED */
1458*61046927SAndroid Build Coastguard Worker };
1459*61046927SAndroid Build Coastguard Worker
1460*61046927SAndroid Build Coastguard Worker enum HEVCNALUnitType {
1461*61046927SAndroid Build Coastguard Worker HEVC_NAL_TRAIL_N = 0,
1462*61046927SAndroid Build Coastguard Worker HEVC_NAL_TRAIL_R = 1,
1463*61046927SAndroid Build Coastguard Worker HEVC_NAL_TSA_N = 2,
1464*61046927SAndroid Build Coastguard Worker HEVC_NAL_TSA_R = 3,
1465*61046927SAndroid Build Coastguard Worker HEVC_NAL_STSA_N = 4,
1466*61046927SAndroid Build Coastguard Worker HEVC_NAL_STSA_R = 5,
1467*61046927SAndroid Build Coastguard Worker HEVC_NAL_RADL_N = 6,
1468*61046927SAndroid Build Coastguard Worker HEVC_NAL_RADL_R = 7,
1469*61046927SAndroid Build Coastguard Worker HEVC_NAL_RASL_N = 8,
1470*61046927SAndroid Build Coastguard Worker HEVC_NAL_RASL_R = 9,
1471*61046927SAndroid Build Coastguard Worker HEVC_NAL_VCL_N10 = 10,
1472*61046927SAndroid Build Coastguard Worker HEVC_NAL_VCL_R11 = 11,
1473*61046927SAndroid Build Coastguard Worker HEVC_NAL_VCL_N12 = 12,
1474*61046927SAndroid Build Coastguard Worker HEVC_NAL_VCL_R13 = 13,
1475*61046927SAndroid Build Coastguard Worker HEVC_NAL_VCL_N14 = 14,
1476*61046927SAndroid Build Coastguard Worker HEVC_NAL_VCL_R15 = 15,
1477*61046927SAndroid Build Coastguard Worker HEVC_NAL_BLA_W_LP = 16,
1478*61046927SAndroid Build Coastguard Worker HEVC_NAL_BLA_W_RADL = 17,
1479*61046927SAndroid Build Coastguard Worker HEVC_NAL_BLA_N_LP = 18,
1480*61046927SAndroid Build Coastguard Worker HEVC_NAL_IDR_W_RADL = 19,
1481*61046927SAndroid Build Coastguard Worker HEVC_NAL_IDR_N_LP = 20,
1482*61046927SAndroid Build Coastguard Worker HEVC_NAL_CRA_NUT = 21,
1483*61046927SAndroid Build Coastguard Worker HEVC_NAL_VPS_NUT = 32,
1484*61046927SAndroid Build Coastguard Worker HEVC_NAL_SPS_NUT = 33,
1485*61046927SAndroid Build Coastguard Worker HEVC_NAL_PPS_NUT = 34,
1486*61046927SAndroid Build Coastguard Worker };
1487*61046927SAndroid Build Coastguard Worker
1488*61046927SAndroid Build Coastguard Worker unsigned
vk_video_get_h265_nal_unit(const StdVideoEncodeH265PictureInfo * pic_info)1489*61046927SAndroid Build Coastguard Worker vk_video_get_h265_nal_unit(const StdVideoEncodeH265PictureInfo *pic_info)
1490*61046927SAndroid Build Coastguard Worker {
1491*61046927SAndroid Build Coastguard Worker switch (pic_info->pic_type) {
1492*61046927SAndroid Build Coastguard Worker case STD_VIDEO_H265_PICTURE_TYPE_IDR:
1493*61046927SAndroid Build Coastguard Worker return HEVC_NAL_IDR_W_RADL;
1494*61046927SAndroid Build Coastguard Worker case STD_VIDEO_H265_PICTURE_TYPE_I:
1495*61046927SAndroid Build Coastguard Worker return HEVC_NAL_CRA_NUT;
1496*61046927SAndroid Build Coastguard Worker case STD_VIDEO_H265_PICTURE_TYPE_P:
1497*61046927SAndroid Build Coastguard Worker return HEVC_NAL_TRAIL_R;
1498*61046927SAndroid Build Coastguard Worker case STD_VIDEO_H265_PICTURE_TYPE_B:
1499*61046927SAndroid Build Coastguard Worker if (pic_info->flags.IrapPicFlag)
1500*61046927SAndroid Build Coastguard Worker if (pic_info->flags.is_reference)
1501*61046927SAndroid Build Coastguard Worker return HEVC_NAL_RASL_R;
1502*61046927SAndroid Build Coastguard Worker else
1503*61046927SAndroid Build Coastguard Worker return HEVC_NAL_RASL_N;
1504*61046927SAndroid Build Coastguard Worker else
1505*61046927SAndroid Build Coastguard Worker if (pic_info->flags.is_reference)
1506*61046927SAndroid Build Coastguard Worker return HEVC_NAL_TRAIL_R;
1507*61046927SAndroid Build Coastguard Worker else
1508*61046927SAndroid Build Coastguard Worker return HEVC_NAL_TRAIL_N;
1509*61046927SAndroid Build Coastguard Worker break;
1510*61046927SAndroid Build Coastguard Worker default:
1511*61046927SAndroid Build Coastguard Worker assert(0);
1512*61046927SAndroid Build Coastguard Worker break;
1513*61046927SAndroid Build Coastguard Worker }
1514*61046927SAndroid Build Coastguard Worker return 0;
1515*61046927SAndroid Build Coastguard Worker }
1516*61046927SAndroid Build Coastguard Worker
1517*61046927SAndroid Build Coastguard Worker static const uint8_t vk_video_h265_levels[] = {10, 20, 21, 30, 31, 40, 41, 50, 51, 52, 60, 61, 62};
1518*61046927SAndroid Build Coastguard Worker
1519*61046927SAndroid Build Coastguard Worker static uint8_t
vk_video_get_h265_level(StdVideoH265LevelIdc level)1520*61046927SAndroid Build Coastguard Worker vk_video_get_h265_level(StdVideoH265LevelIdc level)
1521*61046927SAndroid Build Coastguard Worker {
1522*61046927SAndroid Build Coastguard Worker assert(level <= STD_VIDEO_H265_LEVEL_IDC_6_2);
1523*61046927SAndroid Build Coastguard Worker return vk_video_h265_levels[level];
1524*61046927SAndroid Build Coastguard Worker }
1525*61046927SAndroid Build Coastguard Worker
1526*61046927SAndroid Build Coastguard Worker static void
emit_nalu_header(struct vl_bitstream_encoder * enc,int nal_ref,int nal_unit)1527*61046927SAndroid Build Coastguard Worker emit_nalu_header(struct vl_bitstream_encoder *enc,
1528*61046927SAndroid Build Coastguard Worker int nal_ref, int nal_unit)
1529*61046927SAndroid Build Coastguard Worker {
1530*61046927SAndroid Build Coastguard Worker enc->prevent_start_code = false;
1531*61046927SAndroid Build Coastguard Worker
1532*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 24, 0);
1533*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 8, 1);
1534*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, 0);
1535*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 2, nal_ref); /* SPS NAL REF */
1536*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 5, nal_unit); /* SPS NAL UNIT */
1537*61046927SAndroid Build Coastguard Worker vl_bitstream_flush(enc);
1538*61046927SAndroid Build Coastguard Worker
1539*61046927SAndroid Build Coastguard Worker enc->prevent_start_code = true;
1540*61046927SAndroid Build Coastguard Worker }
1541*61046927SAndroid Build Coastguard Worker
1542*61046927SAndroid Build Coastguard Worker static void
encode_hrd_params(struct vl_bitstream_encoder * enc,const StdVideoH264HrdParameters * hrd)1543*61046927SAndroid Build Coastguard Worker encode_hrd_params(struct vl_bitstream_encoder *enc,
1544*61046927SAndroid Build Coastguard Worker const StdVideoH264HrdParameters *hrd)
1545*61046927SAndroid Build Coastguard Worker {
1546*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(enc, hrd->cpb_cnt_minus1);
1547*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 4, hrd->bit_rate_scale);
1548*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 4, hrd->cpb_size_scale);
1549*61046927SAndroid Build Coastguard Worker for (int sched_sel_idx = 0; sched_sel_idx <= hrd->cpb_cnt_minus1; sched_sel_idx++) {
1550*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(enc, hrd->bit_rate_value_minus1[sched_sel_idx]);
1551*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(enc, hrd->cpb_size_value_minus1[sched_sel_idx]);
1552*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, hrd->cbr_flag[sched_sel_idx]);
1553*61046927SAndroid Build Coastguard Worker }
1554*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 5, hrd->initial_cpb_removal_delay_length_minus1);
1555*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 5, hrd->cpb_removal_delay_length_minus1);
1556*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 5, hrd->dpb_output_delay_length_minus1);
1557*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 5, hrd->time_offset_length);
1558*61046927SAndroid Build Coastguard Worker }
1559*61046927SAndroid Build Coastguard Worker
1560*61046927SAndroid Build Coastguard Worker void
vk_video_encode_h264_sps(const StdVideoH264SequenceParameterSet * sps,size_t size_limit,size_t * data_size_ptr,void * data_ptr)1561*61046927SAndroid Build Coastguard Worker vk_video_encode_h264_sps(const StdVideoH264SequenceParameterSet *sps,
1562*61046927SAndroid Build Coastguard Worker size_t size_limit,
1563*61046927SAndroid Build Coastguard Worker size_t *data_size_ptr,
1564*61046927SAndroid Build Coastguard Worker void *data_ptr)
1565*61046927SAndroid Build Coastguard Worker {
1566*61046927SAndroid Build Coastguard Worker struct vl_bitstream_encoder enc;
1567*61046927SAndroid Build Coastguard Worker uint32_t data_size = *data_size_ptr;
1568*61046927SAndroid Build Coastguard Worker
1569*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_clear(&enc, data_ptr, data_size, size_limit);
1570*61046927SAndroid Build Coastguard Worker
1571*61046927SAndroid Build Coastguard Worker emit_nalu_header(&enc, 3, H264_NAL_SPS);
1572*61046927SAndroid Build Coastguard Worker
1573*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 8, sps->profile_idc);
1574*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.constraint_set0_flag);
1575*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.constraint_set1_flag);
1576*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.constraint_set2_flag);
1577*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.constraint_set3_flag);
1578*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.constraint_set4_flag);
1579*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.constraint_set5_flag);
1580*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 2, 0);
1581*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 8, vk_video_get_h264_level(sps->level_idc));
1582*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->seq_parameter_set_id);
1583*61046927SAndroid Build Coastguard Worker
1584*61046927SAndroid Build Coastguard Worker if (sps->profile_idc == STD_VIDEO_H264_PROFILE_IDC_HIGH /* high10 as well */) {
1585*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->chroma_format_idc);
1586*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->bit_depth_luma_minus8);
1587*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->bit_depth_chroma_minus8);
1588*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.qpprime_y_zero_transform_bypass_flag);
1589*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.seq_scaling_matrix_present_flag);
1590*61046927SAndroid Build Coastguard Worker }
1591*61046927SAndroid Build Coastguard Worker
1592*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->log2_max_frame_num_minus4);
1593*61046927SAndroid Build Coastguard Worker
1594*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->pic_order_cnt_type);
1595*61046927SAndroid Build Coastguard Worker if (sps->pic_order_cnt_type == 0)
1596*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->log2_max_pic_order_cnt_lsb_minus4);
1597*61046927SAndroid Build Coastguard Worker
1598*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->max_num_ref_frames);
1599*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.gaps_in_frame_num_value_allowed_flag);
1600*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->pic_width_in_mbs_minus1);
1601*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->pic_height_in_map_units_minus1);
1602*61046927SAndroid Build Coastguard Worker
1603*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.frame_mbs_only_flag);
1604*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.direct_8x8_inference_flag);
1605*61046927SAndroid Build Coastguard Worker
1606*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.frame_cropping_flag);
1607*61046927SAndroid Build Coastguard Worker if (sps->flags.frame_cropping_flag) {
1608*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->frame_crop_left_offset);
1609*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->frame_crop_right_offset);
1610*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->frame_crop_top_offset);
1611*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->frame_crop_bottom_offset);
1612*61046927SAndroid Build Coastguard Worker }
1613*61046927SAndroid Build Coastguard Worker
1614*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.vui_parameters_present_flag); /* vui parameters present flag */
1615*61046927SAndroid Build Coastguard Worker if (sps->flags.vui_parameters_present_flag) {
1616*61046927SAndroid Build Coastguard Worker const StdVideoH264SequenceParameterSetVui *vui = sps->pSequenceParameterSetVui;
1617*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.aspect_ratio_info_present_flag);
1618*61046927SAndroid Build Coastguard Worker
1619*61046927SAndroid Build Coastguard Worker if (vui->flags.aspect_ratio_info_present_flag) {
1620*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 8, vui->aspect_ratio_idc);
1621*61046927SAndroid Build Coastguard Worker if (vui->aspect_ratio_idc == STD_VIDEO_H264_ASPECT_RATIO_IDC_EXTENDED_SAR) {
1622*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 16, vui->sar_width);
1623*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 16, vui->sar_height);
1624*61046927SAndroid Build Coastguard Worker }
1625*61046927SAndroid Build Coastguard Worker }
1626*61046927SAndroid Build Coastguard Worker
1627*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.overscan_info_present_flag);
1628*61046927SAndroid Build Coastguard Worker if (vui->flags.overscan_info_present_flag)
1629*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.overscan_appropriate_flag);
1630*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.video_signal_type_present_flag);
1631*61046927SAndroid Build Coastguard Worker if (vui->flags.video_signal_type_present_flag) {
1632*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 3, vui->video_format);
1633*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.video_full_range_flag);
1634*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.color_description_present_flag);
1635*61046927SAndroid Build Coastguard Worker if (vui->flags.color_description_present_flag) {
1636*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 8, vui->colour_primaries);
1637*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 8, vui->transfer_characteristics);
1638*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 8, vui->matrix_coefficients);
1639*61046927SAndroid Build Coastguard Worker }
1640*61046927SAndroid Build Coastguard Worker }
1641*61046927SAndroid Build Coastguard Worker
1642*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.chroma_loc_info_present_flag);
1643*61046927SAndroid Build Coastguard Worker if (vui->flags.chroma_loc_info_present_flag) {
1644*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->chroma_sample_loc_type_top_field);
1645*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->chroma_sample_loc_type_bottom_field);
1646*61046927SAndroid Build Coastguard Worker }
1647*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.timing_info_present_flag);
1648*61046927SAndroid Build Coastguard Worker if (vui->flags.timing_info_present_flag) {
1649*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 32, vui->num_units_in_tick);
1650*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 32, vui->time_scale);
1651*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.fixed_frame_rate_flag);
1652*61046927SAndroid Build Coastguard Worker }
1653*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.nal_hrd_parameters_present_flag);
1654*61046927SAndroid Build Coastguard Worker if (vui->flags.nal_hrd_parameters_present_flag)
1655*61046927SAndroid Build Coastguard Worker encode_hrd_params(&enc, vui->pHrdParameters);
1656*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.vcl_hrd_parameters_present_flag);
1657*61046927SAndroid Build Coastguard Worker if (vui->flags.vcl_hrd_parameters_present_flag)
1658*61046927SAndroid Build Coastguard Worker encode_hrd_params(&enc, vui->pHrdParameters);
1659*61046927SAndroid Build Coastguard Worker if (vui->flags.nal_hrd_parameters_present_flag || vui->flags.vcl_hrd_parameters_present_flag)
1660*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, 0);
1661*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, 0);
1662*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.bitstream_restriction_flag);
1663*61046927SAndroid Build Coastguard Worker if (vui->flags.bitstream_restriction_flag) {
1664*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, 0);
1665*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, 0);
1666*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, 0);
1667*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, 0);
1668*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, 0);
1669*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->max_num_reorder_frames);
1670*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->max_dec_frame_buffering);
1671*61046927SAndroid Build Coastguard Worker }
1672*61046927SAndroid Build Coastguard Worker }
1673*61046927SAndroid Build Coastguard Worker
1674*61046927SAndroid Build Coastguard Worker vl_bitstream_rbsp_trailing(&enc);
1675*61046927SAndroid Build Coastguard Worker
1676*61046927SAndroid Build Coastguard Worker vl_bitstream_flush(&enc);
1677*61046927SAndroid Build Coastguard Worker *data_size_ptr += vl_bitstream_get_byte_count(&enc);
1678*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_free(&enc);
1679*61046927SAndroid Build Coastguard Worker }
1680*61046927SAndroid Build Coastguard Worker
1681*61046927SAndroid Build Coastguard Worker void
vk_video_encode_h264_pps(const StdVideoH264PictureParameterSet * pps,bool high_profile,size_t size_limit,size_t * data_size_ptr,void * data_ptr)1682*61046927SAndroid Build Coastguard Worker vk_video_encode_h264_pps(const StdVideoH264PictureParameterSet *pps,
1683*61046927SAndroid Build Coastguard Worker bool high_profile,
1684*61046927SAndroid Build Coastguard Worker size_t size_limit,
1685*61046927SAndroid Build Coastguard Worker size_t *data_size_ptr,
1686*61046927SAndroid Build Coastguard Worker void *data_ptr)
1687*61046927SAndroid Build Coastguard Worker {
1688*61046927SAndroid Build Coastguard Worker struct vl_bitstream_encoder enc;
1689*61046927SAndroid Build Coastguard Worker uint32_t data_size = *data_size_ptr;
1690*61046927SAndroid Build Coastguard Worker
1691*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_clear(&enc, data_ptr, data_size, size_limit);
1692*61046927SAndroid Build Coastguard Worker
1693*61046927SAndroid Build Coastguard Worker emit_nalu_header(&enc, 3, H264_NAL_PPS);
1694*61046927SAndroid Build Coastguard Worker
1695*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pps->pic_parameter_set_id);
1696*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pps->seq_parameter_set_id);
1697*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.entropy_coding_mode_flag);
1698*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.bottom_field_pic_order_in_frame_present_flag);
1699*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, 0); /* num_slice_groups_minus1 */
1700*61046927SAndroid Build Coastguard Worker
1701*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pps->num_ref_idx_l0_default_active_minus1);
1702*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pps->num_ref_idx_l1_default_active_minus1);
1703*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.weighted_pred_flag);
1704*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 2, pps->weighted_bipred_idc);
1705*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, pps->pic_init_qp_minus26);
1706*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, pps->pic_init_qs_minus26);
1707*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, pps->chroma_qp_index_offset);
1708*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.deblocking_filter_control_present_flag);
1709*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.constrained_intra_pred_flag);
1710*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.redundant_pic_cnt_present_flag);
1711*61046927SAndroid Build Coastguard Worker
1712*61046927SAndroid Build Coastguard Worker /* high profile */
1713*61046927SAndroid Build Coastguard Worker if (high_profile) {
1714*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.transform_8x8_mode_flag);
1715*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.pic_scaling_matrix_present_flag);
1716*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, pps->second_chroma_qp_index_offset);
1717*61046927SAndroid Build Coastguard Worker }
1718*61046927SAndroid Build Coastguard Worker vl_bitstream_rbsp_trailing(&enc);
1719*61046927SAndroid Build Coastguard Worker
1720*61046927SAndroid Build Coastguard Worker vl_bitstream_flush(&enc);
1721*61046927SAndroid Build Coastguard Worker *data_size_ptr += vl_bitstream_get_byte_count(&enc);
1722*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_free(&enc);
1723*61046927SAndroid Build Coastguard Worker }
1724*61046927SAndroid Build Coastguard Worker
1725*61046927SAndroid Build Coastguard Worker static void
emit_nalu_h265_header(struct vl_bitstream_encoder * enc,int nal_unit_type)1726*61046927SAndroid Build Coastguard Worker emit_nalu_h265_header(struct vl_bitstream_encoder *enc,
1727*61046927SAndroid Build Coastguard Worker int nal_unit_type)
1728*61046927SAndroid Build Coastguard Worker {
1729*61046927SAndroid Build Coastguard Worker enc->prevent_start_code = false;
1730*61046927SAndroid Build Coastguard Worker
1731*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 24, 0);
1732*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 8, 1);
1733*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, 0);
1734*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 6, nal_unit_type); /* SPS NAL REF */
1735*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 6, 0);//nuh_layer_id
1736*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 3, 1);//nuh_temporal_id_plus1;
1737*61046927SAndroid Build Coastguard Worker vl_bitstream_flush(enc);
1738*61046927SAndroid Build Coastguard Worker
1739*61046927SAndroid Build Coastguard Worker enc->prevent_start_code = true;
1740*61046927SAndroid Build Coastguard Worker }
1741*61046927SAndroid Build Coastguard Worker
1742*61046927SAndroid Build Coastguard Worker static void
encode_h265_profile_tier_level(struct vl_bitstream_encoder * enc,const StdVideoH265ProfileTierLevel * ptl,unsigned int max_sub_layers_minus1)1743*61046927SAndroid Build Coastguard Worker encode_h265_profile_tier_level(struct vl_bitstream_encoder *enc,
1744*61046927SAndroid Build Coastguard Worker const StdVideoH265ProfileTierLevel *ptl,
1745*61046927SAndroid Build Coastguard Worker unsigned int max_sub_layers_minus1)
1746*61046927SAndroid Build Coastguard Worker {
1747*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 2, 0);
1748*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, ptl->flags.general_tier_flag);
1749*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 5, ptl->general_profile_idc);
1750*61046927SAndroid Build Coastguard Worker
1751*61046927SAndroid Build Coastguard Worker for (int j = 0; j < 32; j++)
1752*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, j == ptl->general_profile_idc);
1753*61046927SAndroid Build Coastguard Worker
1754*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, ptl->flags.general_progressive_source_flag);
1755*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, ptl->flags.general_interlaced_source_flag);
1756*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, ptl->flags.general_non_packed_constraint_flag);
1757*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, ptl->flags.general_frame_only_constraint_flag);
1758*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 31, 0);
1759*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 13, 0);
1760*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 8, vk_video_get_h265_level(ptl->general_level_idc));
1761*61046927SAndroid Build Coastguard Worker
1762*61046927SAndroid Build Coastguard Worker if (max_sub_layers_minus1 > 0) {
1763*61046927SAndroid Build Coastguard Worker /* sub_layer_(profile|level)_present_flag, plus padding */
1764*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 16, 0);
1765*61046927SAndroid Build Coastguard Worker }
1766*61046927SAndroid Build Coastguard Worker }
1767*61046927SAndroid Build Coastguard Worker
1768*61046927SAndroid Build Coastguard Worker void
vk_video_encode_h265_vps(const StdVideoH265VideoParameterSet * vps,size_t size_limit,size_t * data_size_ptr,void * data_ptr)1769*61046927SAndroid Build Coastguard Worker vk_video_encode_h265_vps(const StdVideoH265VideoParameterSet *vps,
1770*61046927SAndroid Build Coastguard Worker size_t size_limit,
1771*61046927SAndroid Build Coastguard Worker size_t *data_size_ptr,
1772*61046927SAndroid Build Coastguard Worker void *data_ptr)
1773*61046927SAndroid Build Coastguard Worker {
1774*61046927SAndroid Build Coastguard Worker struct vl_bitstream_encoder enc;
1775*61046927SAndroid Build Coastguard Worker uint32_t data_size = *data_size_ptr;
1776*61046927SAndroid Build Coastguard Worker
1777*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_clear(&enc, data_ptr, data_size, size_limit);
1778*61046927SAndroid Build Coastguard Worker
1779*61046927SAndroid Build Coastguard Worker emit_nalu_h265_header(&enc, HEVC_NAL_VPS_NUT);
1780*61046927SAndroid Build Coastguard Worker
1781*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 4, vps->vps_video_parameter_set_id);
1782*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 2, 3);
1783*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 6, 0);//vps->vps_max_layers_minus1);
1784*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 3, vps->vps_max_sub_layers_minus1);
1785*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vps->flags.vps_temporal_id_nesting_flag);
1786*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 16, 0xffff);
1787*61046927SAndroid Build Coastguard Worker
1788*61046927SAndroid Build Coastguard Worker encode_h265_profile_tier_level(&enc, vps->pProfileTierLevel, vps->vps_max_sub_layers_minus1);
1789*61046927SAndroid Build Coastguard Worker
1790*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vps->flags.vps_sub_layer_ordering_info_present_flag);
1791*61046927SAndroid Build Coastguard Worker
1792*61046927SAndroid Build Coastguard Worker int i = vps->flags.vps_sub_layer_ordering_info_present_flag ? 0 : vps->vps_max_sub_layers_minus1;
1793*61046927SAndroid Build Coastguard Worker for (; i <= vps->vps_max_sub_layers_minus1; i++) {
1794*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vps->pDecPicBufMgr->max_dec_pic_buffering_minus1[i]);
1795*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vps->pDecPicBufMgr->max_num_reorder_pics[i]);
1796*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vps->pDecPicBufMgr->max_latency_increase_plus1[i]);
1797*61046927SAndroid Build Coastguard Worker }
1798*61046927SAndroid Build Coastguard Worker
1799*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 6, 0);//vps->vps_max_layer_id);
1800*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, 0);//vps->vps_num_layer_sets_minus1);
1801*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vps->flags.vps_timing_info_present_flag);
1802*61046927SAndroid Build Coastguard Worker
1803*61046927SAndroid Build Coastguard Worker if (vps->flags.vps_timing_info_present_flag) {
1804*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 32, vps->vps_num_units_in_tick);
1805*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 32, vps->vps_time_scale);
1806*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vps->flags.vps_poc_proportional_to_timing_flag);
1807*61046927SAndroid Build Coastguard Worker if (vps->flags.vps_poc_proportional_to_timing_flag)
1808*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vps->vps_num_ticks_poc_diff_one_minus1);
1809*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, 0);
1810*61046927SAndroid Build Coastguard Worker }
1811*61046927SAndroid Build Coastguard Worker
1812*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, 0); /* vps extension flag */
1813*61046927SAndroid Build Coastguard Worker vl_bitstream_rbsp_trailing(&enc);
1814*61046927SAndroid Build Coastguard Worker
1815*61046927SAndroid Build Coastguard Worker vl_bitstream_flush(&enc);
1816*61046927SAndroid Build Coastguard Worker *data_size_ptr += vl_bitstream_get_byte_count(&enc);
1817*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_free(&enc);
1818*61046927SAndroid Build Coastguard Worker }
1819*61046927SAndroid Build Coastguard Worker
1820*61046927SAndroid Build Coastguard Worker static void
encode_rps(struct vl_bitstream_encoder * enc,const StdVideoH265SequenceParameterSet * sps,int st_rps_idx)1821*61046927SAndroid Build Coastguard Worker encode_rps(struct vl_bitstream_encoder *enc,
1822*61046927SAndroid Build Coastguard Worker const StdVideoH265SequenceParameterSet *sps,
1823*61046927SAndroid Build Coastguard Worker int st_rps_idx)
1824*61046927SAndroid Build Coastguard Worker {
1825*61046927SAndroid Build Coastguard Worker const StdVideoH265ShortTermRefPicSet *rps = &sps->pShortTermRefPicSet[st_rps_idx];
1826*61046927SAndroid Build Coastguard Worker if (st_rps_idx != 0)
1827*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, rps->flags.inter_ref_pic_set_prediction_flag);
1828*61046927SAndroid Build Coastguard Worker
1829*61046927SAndroid Build Coastguard Worker if (rps->flags.inter_ref_pic_set_prediction_flag) {
1830*61046927SAndroid Build Coastguard Worker int ref_rps_idx = st_rps_idx - (rps->delta_idx_minus1 + 1);
1831*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, rps->flags.delta_rps_sign);
1832*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(enc, rps->abs_delta_rps_minus1);
1833*61046927SAndroid Build Coastguard Worker
1834*61046927SAndroid Build Coastguard Worker const StdVideoH265ShortTermRefPicSet *rps_ref = &sps->pShortTermRefPicSet[ref_rps_idx];
1835*61046927SAndroid Build Coastguard Worker int num_delta_pocs = rps_ref->num_negative_pics + rps_ref->num_positive_pics;
1836*61046927SAndroid Build Coastguard Worker
1837*61046927SAndroid Build Coastguard Worker for (int j = 0; j < num_delta_pocs; j++) {
1838*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, !!(rps->used_by_curr_pic_flag & (1 << j)));
1839*61046927SAndroid Build Coastguard Worker if (!(rps->used_by_curr_pic_flag & (1 << j))) {
1840*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, !!(rps->use_delta_flag & (1 << j)));
1841*61046927SAndroid Build Coastguard Worker }
1842*61046927SAndroid Build Coastguard Worker }
1843*61046927SAndroid Build Coastguard Worker } else {
1844*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(enc, rps->num_negative_pics);
1845*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(enc, rps->num_positive_pics);
1846*61046927SAndroid Build Coastguard Worker
1847*61046927SAndroid Build Coastguard Worker for (int i = 0; i < rps->num_negative_pics; i++) {
1848*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(enc, rps->delta_poc_s0_minus1[i]);
1849*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, !!(rps->used_by_curr_pic_s0_flag & (1 << i)));
1850*61046927SAndroid Build Coastguard Worker }
1851*61046927SAndroid Build Coastguard Worker for (int i = 0; i < rps->num_positive_pics; i++) {
1852*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(enc, rps->delta_poc_s1_minus1[i]);
1853*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(enc, 1, !!(rps->used_by_curr_pic_s1_flag & (1 << i)));
1854*61046927SAndroid Build Coastguard Worker }
1855*61046927SAndroid Build Coastguard Worker }
1856*61046927SAndroid Build Coastguard Worker }
1857*61046927SAndroid Build Coastguard Worker
1858*61046927SAndroid Build Coastguard Worker void
vk_video_encode_h265_sps(const StdVideoH265SequenceParameterSet * sps,size_t size_limit,size_t * data_size_ptr,void * data_ptr)1859*61046927SAndroid Build Coastguard Worker vk_video_encode_h265_sps(const StdVideoH265SequenceParameterSet *sps,
1860*61046927SAndroid Build Coastguard Worker size_t size_limit,
1861*61046927SAndroid Build Coastguard Worker size_t *data_size_ptr,
1862*61046927SAndroid Build Coastguard Worker void *data_ptr)
1863*61046927SAndroid Build Coastguard Worker {
1864*61046927SAndroid Build Coastguard Worker struct vl_bitstream_encoder enc;
1865*61046927SAndroid Build Coastguard Worker uint32_t data_size = *data_size_ptr;
1866*61046927SAndroid Build Coastguard Worker
1867*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_clear(&enc, data_ptr, data_size, size_limit);
1868*61046927SAndroid Build Coastguard Worker
1869*61046927SAndroid Build Coastguard Worker emit_nalu_h265_header(&enc, HEVC_NAL_SPS_NUT);
1870*61046927SAndroid Build Coastguard Worker
1871*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 4, sps->sps_video_parameter_set_id);
1872*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 3, sps->sps_max_sub_layers_minus1);
1873*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.sps_temporal_id_nesting_flag);
1874*61046927SAndroid Build Coastguard Worker
1875*61046927SAndroid Build Coastguard Worker encode_h265_profile_tier_level(&enc, sps->pProfileTierLevel, sps->sps_max_sub_layers_minus1);
1876*61046927SAndroid Build Coastguard Worker
1877*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->sps_seq_parameter_set_id);
1878*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->chroma_format_idc);
1879*61046927SAndroid Build Coastguard Worker
1880*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->pic_width_in_luma_samples);
1881*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->pic_height_in_luma_samples);
1882*61046927SAndroid Build Coastguard Worker
1883*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.conformance_window_flag);
1884*61046927SAndroid Build Coastguard Worker
1885*61046927SAndroid Build Coastguard Worker if (sps->flags.conformance_window_flag) {
1886*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->conf_win_left_offset);
1887*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->conf_win_right_offset);
1888*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->conf_win_top_offset);
1889*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->conf_win_bottom_offset);
1890*61046927SAndroid Build Coastguard Worker }
1891*61046927SAndroid Build Coastguard Worker
1892*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->bit_depth_luma_minus8);
1893*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->bit_depth_chroma_minus8);
1894*61046927SAndroid Build Coastguard Worker
1895*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->log2_max_pic_order_cnt_lsb_minus4);
1896*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.sps_sub_layer_ordering_info_present_flag);
1897*61046927SAndroid Build Coastguard Worker
1898*61046927SAndroid Build Coastguard Worker int i = sps->flags.sps_sub_layer_ordering_info_present_flag ? 0 : sps->sps_max_sub_layers_minus1;
1899*61046927SAndroid Build Coastguard Worker for (; i <= sps->sps_max_sub_layers_minus1; i++) {
1900*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->pDecPicBufMgr->max_dec_pic_buffering_minus1[i]);
1901*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->pDecPicBufMgr->max_num_reorder_pics[i]);
1902*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->pDecPicBufMgr->max_latency_increase_plus1[i]);
1903*61046927SAndroid Build Coastguard Worker }
1904*61046927SAndroid Build Coastguard Worker
1905*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->log2_min_luma_coding_block_size_minus3);
1906*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->log2_diff_max_min_luma_coding_block_size);
1907*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->log2_min_luma_transform_block_size_minus2);
1908*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->log2_diff_max_min_luma_transform_block_size);
1909*61046927SAndroid Build Coastguard Worker
1910*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->max_transform_hierarchy_depth_inter);
1911*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->max_transform_hierarchy_depth_intra);
1912*61046927SAndroid Build Coastguard Worker
1913*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.scaling_list_enabled_flag);
1914*61046927SAndroid Build Coastguard Worker
1915*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.amp_enabled_flag);
1916*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.sample_adaptive_offset_enabled_flag);
1917*61046927SAndroid Build Coastguard Worker
1918*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.pcm_enabled_flag);
1919*61046927SAndroid Build Coastguard Worker
1920*61046927SAndroid Build Coastguard Worker if (sps->flags.pcm_enabled_flag) {
1921*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 4, sps->bit_depth_luma_minus8 + 7);
1922*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 4, sps->bit_depth_chroma_minus8 + 7);
1923*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->log2_min_luma_coding_block_size_minus3);
1924*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->log2_diff_max_min_luma_coding_block_size);
1925*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.pcm_loop_filter_disabled_flag);
1926*61046927SAndroid Build Coastguard Worker }
1927*61046927SAndroid Build Coastguard Worker
1928*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->num_short_term_ref_pic_sets);
1929*61046927SAndroid Build Coastguard Worker for (int i = 0; i < sps->num_short_term_ref_pic_sets; i++)
1930*61046927SAndroid Build Coastguard Worker encode_rps(&enc, sps, i);
1931*61046927SAndroid Build Coastguard Worker
1932*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.long_term_ref_pics_present_flag);
1933*61046927SAndroid Build Coastguard Worker if (sps->flags.long_term_ref_pics_present_flag) {
1934*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, sps->num_long_term_ref_pics_sps);
1935*61046927SAndroid Build Coastguard Worker for (int i = 0; i < sps->num_long_term_ref_pics_sps; i++) {
1936*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, sps->log2_max_pic_order_cnt_lsb_minus4 + 4, sps->pLongTermRefPicsSps->lt_ref_pic_poc_lsb_sps[i]);
1937*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->pLongTermRefPicsSps->used_by_curr_pic_lt_sps_flag);
1938*61046927SAndroid Build Coastguard Worker }
1939*61046927SAndroid Build Coastguard Worker }
1940*61046927SAndroid Build Coastguard Worker
1941*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.sps_temporal_mvp_enabled_flag);
1942*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.strong_intra_smoothing_enabled_flag);
1943*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, sps->flags.vui_parameters_present_flag);
1944*61046927SAndroid Build Coastguard Worker
1945*61046927SAndroid Build Coastguard Worker if (sps->flags.vui_parameters_present_flag) {
1946*61046927SAndroid Build Coastguard Worker const StdVideoH265SequenceParameterSetVui *vui = sps->pSequenceParameterSetVui;
1947*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.aspect_ratio_info_present_flag);
1948*61046927SAndroid Build Coastguard Worker if (vui->flags.aspect_ratio_info_present_flag) {
1949*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 8, vui->aspect_ratio_idc);
1950*61046927SAndroid Build Coastguard Worker if (vui->aspect_ratio_idc == STD_VIDEO_H265_ASPECT_RATIO_IDC_EXTENDED_SAR) {
1951*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 16, vui->sar_width);
1952*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 16, vui->sar_height);
1953*61046927SAndroid Build Coastguard Worker }
1954*61046927SAndroid Build Coastguard Worker }
1955*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.overscan_info_present_flag);
1956*61046927SAndroid Build Coastguard Worker if (vui->flags.overscan_info_present_flag)
1957*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.overscan_appropriate_flag);
1958*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.video_signal_type_present_flag);
1959*61046927SAndroid Build Coastguard Worker if (vui->flags.video_signal_type_present_flag) {
1960*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 3, vui->video_format);
1961*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.video_full_range_flag);
1962*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.colour_description_present_flag);
1963*61046927SAndroid Build Coastguard Worker if (vui->flags.colour_description_present_flag) {
1964*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 8, vui->colour_primaries);
1965*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 8, vui->transfer_characteristics);
1966*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 8, vui->matrix_coeffs);
1967*61046927SAndroid Build Coastguard Worker }
1968*61046927SAndroid Build Coastguard Worker }
1969*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.chroma_loc_info_present_flag);
1970*61046927SAndroid Build Coastguard Worker if (vui->flags.chroma_loc_info_present_flag) {
1971*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->chroma_sample_loc_type_top_field);
1972*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->chroma_sample_loc_type_bottom_field);
1973*61046927SAndroid Build Coastguard Worker }
1974*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.neutral_chroma_indication_flag);
1975*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.field_seq_flag);
1976*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.frame_field_info_present_flag);
1977*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.default_display_window_flag);
1978*61046927SAndroid Build Coastguard Worker if (vui->flags.default_display_window_flag) {
1979*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->def_disp_win_left_offset);
1980*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->def_disp_win_right_offset);
1981*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->def_disp_win_top_offset);
1982*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->def_disp_win_bottom_offset);
1983*61046927SAndroid Build Coastguard Worker }
1984*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.vui_timing_info_present_flag);
1985*61046927SAndroid Build Coastguard Worker if (vui->flags.vui_timing_info_present_flag) {
1986*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 32, vui->vui_num_units_in_tick);
1987*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 32, vui->vui_time_scale);
1988*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.vui_poc_proportional_to_timing_flag);
1989*61046927SAndroid Build Coastguard Worker if (vui->flags.vui_poc_proportional_to_timing_flag)
1990*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->vui_num_ticks_poc_diff_one_minus1);
1991*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, 0);//vui->flags.vui_hrd_parameters_present_flag);
1992*61046927SAndroid Build Coastguard Worker // HRD
1993*61046927SAndroid Build Coastguard Worker }
1994*61046927SAndroid Build Coastguard Worker
1995*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.bitstream_restriction_flag);
1996*61046927SAndroid Build Coastguard Worker if (vui->flags.bitstream_restriction_flag) {
1997*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.tiles_fixed_structure_flag);
1998*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.motion_vectors_over_pic_boundaries_flag);
1999*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, vui->flags.restricted_ref_pic_lists_flag);
2000*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->min_spatial_segmentation_idc);
2001*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->max_bytes_per_pic_denom);
2002*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->max_bits_per_min_cu_denom);
2003*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->log2_max_mv_length_horizontal);
2004*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, vui->log2_max_mv_length_vertical);
2005*61046927SAndroid Build Coastguard Worker }
2006*61046927SAndroid Build Coastguard Worker }
2007*61046927SAndroid Build Coastguard Worker
2008*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, 0); /* sps extension flg */
2009*61046927SAndroid Build Coastguard Worker vl_bitstream_rbsp_trailing(&enc);
2010*61046927SAndroid Build Coastguard Worker
2011*61046927SAndroid Build Coastguard Worker vl_bitstream_flush(&enc);
2012*61046927SAndroid Build Coastguard Worker *data_size_ptr += vl_bitstream_get_byte_count(&enc);
2013*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_free(&enc);
2014*61046927SAndroid Build Coastguard Worker }
2015*61046927SAndroid Build Coastguard Worker
2016*61046927SAndroid Build Coastguard Worker void
vk_video_encode_h265_pps(const StdVideoH265PictureParameterSet * pps,size_t size_limit,size_t * data_size_ptr,void * data_ptr)2017*61046927SAndroid Build Coastguard Worker vk_video_encode_h265_pps(const StdVideoH265PictureParameterSet *pps,
2018*61046927SAndroid Build Coastguard Worker size_t size_limit,
2019*61046927SAndroid Build Coastguard Worker size_t *data_size_ptr,
2020*61046927SAndroid Build Coastguard Worker void *data_ptr)
2021*61046927SAndroid Build Coastguard Worker {
2022*61046927SAndroid Build Coastguard Worker struct vl_bitstream_encoder enc;
2023*61046927SAndroid Build Coastguard Worker uint32_t data_size = *data_size_ptr;
2024*61046927SAndroid Build Coastguard Worker
2025*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_clear(&enc, data_ptr, data_size, size_limit);
2026*61046927SAndroid Build Coastguard Worker
2027*61046927SAndroid Build Coastguard Worker emit_nalu_h265_header(&enc, HEVC_NAL_PPS_NUT);
2028*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pps->pps_pic_parameter_set_id);
2029*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pps->pps_seq_parameter_set_id);
2030*61046927SAndroid Build Coastguard Worker
2031*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.dependent_slice_segments_enabled_flag);
2032*61046927SAndroid Build Coastguard Worker
2033*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.output_flag_present_flag);
2034*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 3, pps->num_extra_slice_header_bits);
2035*61046927SAndroid Build Coastguard Worker
2036*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.sign_data_hiding_enabled_flag);
2037*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.cabac_init_present_flag);
2038*61046927SAndroid Build Coastguard Worker
2039*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pps->num_ref_idx_l0_default_active_minus1);
2040*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pps->num_ref_idx_l1_default_active_minus1);
2041*61046927SAndroid Build Coastguard Worker
2042*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, pps->init_qp_minus26);
2043*61046927SAndroid Build Coastguard Worker
2044*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.constrained_intra_pred_flag);
2045*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.transform_skip_enabled_flag);
2046*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.cu_qp_delta_enabled_flag);
2047*61046927SAndroid Build Coastguard Worker
2048*61046927SAndroid Build Coastguard Worker if (pps->flags.cu_qp_delta_enabled_flag)
2049*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pps->diff_cu_qp_delta_depth);
2050*61046927SAndroid Build Coastguard Worker
2051*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, pps->pps_cb_qp_offset);
2052*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, pps->pps_cr_qp_offset);
2053*61046927SAndroid Build Coastguard Worker
2054*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.pps_slice_chroma_qp_offsets_present_flag);
2055*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.weighted_pred_flag);
2056*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.weighted_bipred_flag);
2057*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.transquant_bypass_enabled_flag);
2058*61046927SAndroid Build Coastguard Worker
2059*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.tiles_enabled_flag);
2060*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.entropy_coding_sync_enabled_flag);
2061*61046927SAndroid Build Coastguard Worker
2062*61046927SAndroid Build Coastguard Worker assert (!pps->flags.tiles_enabled_flag);
2063*61046927SAndroid Build Coastguard Worker
2064*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.pps_loop_filter_across_slices_enabled_flag);
2065*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.deblocking_filter_control_present_flag);
2066*61046927SAndroid Build Coastguard Worker
2067*61046927SAndroid Build Coastguard Worker if (pps->flags.deblocking_filter_control_present_flag) {
2068*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.deblocking_filter_override_enabled_flag);
2069*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.pps_deblocking_filter_disabled_flag);
2070*61046927SAndroid Build Coastguard Worker if (!pps->flags.pps_deblocking_filter_disabled_flag) {
2071*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, pps->pps_beta_offset_div2);
2072*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, pps->pps_tc_offset_div2);
2073*61046927SAndroid Build Coastguard Worker }
2074*61046927SAndroid Build Coastguard Worker }
2075*61046927SAndroid Build Coastguard Worker
2076*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.pps_scaling_list_data_present_flag);
2077*61046927SAndroid Build Coastguard Worker assert (!pps->flags.pps_scaling_list_data_present_flag);
2078*61046927SAndroid Build Coastguard Worker
2079*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.lists_modification_present_flag);
2080*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pps->log2_parallel_merge_level_minus2);
2081*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pps->flags.slice_segment_header_extension_present_flag);
2082*61046927SAndroid Build Coastguard Worker
2083*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, 0); /* pps extension flag */
2084*61046927SAndroid Build Coastguard Worker vl_bitstream_rbsp_trailing(&enc);
2085*61046927SAndroid Build Coastguard Worker
2086*61046927SAndroid Build Coastguard Worker vl_bitstream_flush(&enc);
2087*61046927SAndroid Build Coastguard Worker *data_size_ptr += vl_bitstream_get_byte_count(&enc);
2088*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_free(&enc);
2089*61046927SAndroid Build Coastguard Worker }
2090*61046927SAndroid Build Coastguard Worker
2091*61046927SAndroid Build Coastguard Worker void
vk_video_encode_h264_slice_header(const StdVideoEncodeH264PictureInfo * pic_info,const StdVideoH264SequenceParameterSet * sps,const StdVideoH264PictureParameterSet * pps,const StdVideoEncodeH264SliceHeader * slice_header,const int8_t slice_qp_delta,size_t * data_size_ptr,void * data_ptr)2092*61046927SAndroid Build Coastguard Worker vk_video_encode_h264_slice_header(const StdVideoEncodeH264PictureInfo *pic_info,
2093*61046927SAndroid Build Coastguard Worker const StdVideoH264SequenceParameterSet *sps,
2094*61046927SAndroid Build Coastguard Worker const StdVideoH264PictureParameterSet *pps,
2095*61046927SAndroid Build Coastguard Worker const StdVideoEncodeH264SliceHeader *slice_header,
2096*61046927SAndroid Build Coastguard Worker const int8_t slice_qp_delta,
2097*61046927SAndroid Build Coastguard Worker size_t *data_size_ptr,
2098*61046927SAndroid Build Coastguard Worker void *data_ptr)
2099*61046927SAndroid Build Coastguard Worker {
2100*61046927SAndroid Build Coastguard Worker struct vl_bitstream_encoder enc;
2101*61046927SAndroid Build Coastguard Worker uint32_t data_size = *data_size_ptr;
2102*61046927SAndroid Build Coastguard Worker
2103*61046927SAndroid Build Coastguard Worker int is_idr = !!pic_info->flags.IdrPicFlag;
2104*61046927SAndroid Build Coastguard Worker int is_ref = !!pic_info->flags.is_reference;
2105*61046927SAndroid Build Coastguard Worker uint32_t slice_type = slice_header->slice_type % 5;
2106*61046927SAndroid Build Coastguard Worker
2107*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_clear(&enc, data_ptr, data_size, VL_BITSTREAM_MAX_BUFFER);
2108*61046927SAndroid Build Coastguard Worker
2109*61046927SAndroid Build Coastguard Worker if (slice_type == STD_VIDEO_H264_SLICE_TYPE_I) {
2110*61046927SAndroid Build Coastguard Worker emit_nalu_header(&enc, 3, is_idr ? H264_NAL_IDR : H264_NAL_SLICE);
2111*61046927SAndroid Build Coastguard Worker } else if (slice_type == STD_VIDEO_H264_SLICE_TYPE_P) {
2112*61046927SAndroid Build Coastguard Worker assert(!is_idr);
2113*61046927SAndroid Build Coastguard Worker emit_nalu_header(&enc, 2, H264_NAL_SLICE);
2114*61046927SAndroid Build Coastguard Worker } else {
2115*61046927SAndroid Build Coastguard Worker assert(slice_type == STD_VIDEO_H264_SLICE_TYPE_B);
2116*61046927SAndroid Build Coastguard Worker assert(!is_idr);
2117*61046927SAndroid Build Coastguard Worker emit_nalu_header(&enc, is_ref ? 1 : 0, H264_NAL_SLICE);
2118*61046927SAndroid Build Coastguard Worker }
2119*61046927SAndroid Build Coastguard Worker
2120*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->first_mb_in_slice);
2121*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, slice_header->slice_type);
2122*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pic_info->pic_parameter_set_id);
2123*61046927SAndroid Build Coastguard Worker
2124*61046927SAndroid Build Coastguard Worker if (sps->flags.separate_colour_plane_flag)
2125*61046927SAndroid Build Coastguard Worker /* colour plane id */
2126*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 2, 0);
2127*61046927SAndroid Build Coastguard Worker
2128*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, sps->log2_max_frame_num_minus4 + 4, pic_info->frame_num);
2129*61046927SAndroid Build Coastguard Worker
2130*61046927SAndroid Build Coastguard Worker /* frame_mbs_only_flag == 1 */
2131*61046927SAndroid Build Coastguard Worker if (!sps->flags.frame_mbs_only_flag) {
2132*61046927SAndroid Build Coastguard Worker /* FIXME: */
2133*61046927SAndroid Build Coastguard Worker assert(0);
2134*61046927SAndroid Build Coastguard Worker }
2135*61046927SAndroid Build Coastguard Worker
2136*61046927SAndroid Build Coastguard Worker if (pic_info->flags.IdrPicFlag)
2137*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pic_info->idr_pic_id);
2138*61046927SAndroid Build Coastguard Worker
2139*61046927SAndroid Build Coastguard Worker if (sps->pic_order_cnt_type == STD_VIDEO_H264_POC_TYPE_0) {
2140*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, sps->log2_max_pic_order_cnt_lsb_minus4 + 4, pic_info->PicOrderCnt);
2141*61046927SAndroid Build Coastguard Worker /* pic_order_present_flag == 0 */
2142*61046927SAndroid Build Coastguard Worker if (pps->flags.bottom_field_pic_order_in_frame_present_flag) {
2143*61046927SAndroid Build Coastguard Worker assert(0);
2144*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, 0);
2145*61046927SAndroid Build Coastguard Worker }
2146*61046927SAndroid Build Coastguard Worker } else if (sps->pic_order_cnt_type == STD_VIDEO_H264_POC_TYPE_1) {
2147*61046927SAndroid Build Coastguard Worker assert(0);
2148*61046927SAndroid Build Coastguard Worker
2149*61046927SAndroid Build Coastguard Worker if (!sps->flags.delta_pic_order_always_zero_flag) {
2150*61046927SAndroid Build Coastguard Worker }
2151*61046927SAndroid Build Coastguard Worker } else if (sps->pic_order_cnt_type == STD_VIDEO_H264_POC_TYPE_2) {
2152*61046927SAndroid Build Coastguard Worker } else {
2153*61046927SAndroid Build Coastguard Worker assert(0);
2154*61046927SAndroid Build Coastguard Worker }
2155*61046927SAndroid Build Coastguard Worker
2156*61046927SAndroid Build Coastguard Worker /* redundant_pic_cnt_present_flag == 0 */
2157*61046927SAndroid Build Coastguard Worker if (pps->flags.redundant_pic_cnt_present_flag) {
2158*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, 0);
2159*61046927SAndroid Build Coastguard Worker }
2160*61046927SAndroid Build Coastguard Worker
2161*61046927SAndroid Build Coastguard Worker /* slice type */
2162*61046927SAndroid Build Coastguard Worker if (slice_type == STD_VIDEO_H264_SLICE_TYPE_P) {
2163*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.num_ref_idx_active_override_flag);
2164*61046927SAndroid Build Coastguard Worker
2165*61046927SAndroid Build Coastguard Worker if (slice_header->flags.num_ref_idx_active_override_flag) {
2166*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pic_info->pRefLists->num_ref_idx_l0_active_minus1);
2167*61046927SAndroid Build Coastguard Worker }
2168*61046927SAndroid Build Coastguard Worker
2169*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pic_info->pRefLists->flags.ref_pic_list_modification_flag_l0);
2170*61046927SAndroid Build Coastguard Worker
2171*61046927SAndroid Build Coastguard Worker if (pic_info->pRefLists->flags.ref_pic_list_modification_flag_l0) {
2172*61046927SAndroid Build Coastguard Worker assert(0);
2173*61046927SAndroid Build Coastguard Worker /* TODO */
2174*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < pic_info->pRefLists->refList0ModOpCount; i++) {
2175*61046927SAndroid Build Coastguard Worker }
2176*61046927SAndroid Build Coastguard Worker }
2177*61046927SAndroid Build Coastguard Worker } else if (slice_type == STD_VIDEO_H264_SLICE_TYPE_B) {
2178*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.direct_spatial_mv_pred_flag);
2179*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.num_ref_idx_active_override_flag);
2180*61046927SAndroid Build Coastguard Worker
2181*61046927SAndroid Build Coastguard Worker if (slice_header->flags.num_ref_idx_active_override_flag) {
2182*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pic_info->pRefLists->num_ref_idx_l0_active_minus1);
2183*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pic_info->pRefLists->num_ref_idx_l1_active_minus1);
2184*61046927SAndroid Build Coastguard Worker }
2185*61046927SAndroid Build Coastguard Worker
2186*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pic_info->pRefLists->flags.ref_pic_list_modification_flag_l0);
2187*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pic_info->pRefLists->flags.ref_pic_list_modification_flag_l1);
2188*61046927SAndroid Build Coastguard Worker
2189*61046927SAndroid Build Coastguard Worker if (pic_info->pRefLists->flags.ref_pic_list_modification_flag_l0) {
2190*61046927SAndroid Build Coastguard Worker assert(0);
2191*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < pic_info->pRefLists->refList0ModOpCount; i++) {
2192*61046927SAndroid Build Coastguard Worker }
2193*61046927SAndroid Build Coastguard Worker }
2194*61046927SAndroid Build Coastguard Worker if (pic_info->pRefLists->flags.ref_pic_list_modification_flag_l1) {
2195*61046927SAndroid Build Coastguard Worker assert(0);
2196*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < pic_info->pRefLists->refList1ModOpCount; i++) {
2197*61046927SAndroid Build Coastguard Worker }
2198*61046927SAndroid Build Coastguard Worker }
2199*61046927SAndroid Build Coastguard Worker }
2200*61046927SAndroid Build Coastguard Worker
2201*61046927SAndroid Build Coastguard Worker if ((pps->flags.weighted_pred_flag && (slice_type == STD_VIDEO_H264_SLICE_TYPE_P)) ||
2202*61046927SAndroid Build Coastguard Worker ((pps->weighted_bipred_idc == 1) && (slice_type == STD_VIDEO_H264_SLICE_TYPE_B))) {
2203*61046927SAndroid Build Coastguard Worker /* FIXME: fill weight/offset table */
2204*61046927SAndroid Build Coastguard Worker assert(0);
2205*61046927SAndroid Build Coastguard Worker }
2206*61046927SAndroid Build Coastguard Worker
2207*61046927SAndroid Build Coastguard Worker /* dec_ref_pic_marking */
2208*61046927SAndroid Build Coastguard Worker /* nal_ref_idc != 0 */
2209*61046927SAndroid Build Coastguard Worker if (slice_type != STD_VIDEO_H264_SLICE_TYPE_B || pic_info->flags.is_reference) {
2210*61046927SAndroid Build Coastguard Worker unsigned char no_output_of_prior_pics_flag = 0;
2211*61046927SAndroid Build Coastguard Worker unsigned char long_term_reference_flag = 0;
2212*61046927SAndroid Build Coastguard Worker unsigned char adaptive_ref_pic_marking_mode_flag = 0;
2213*61046927SAndroid Build Coastguard Worker
2214*61046927SAndroid Build Coastguard Worker if (pic_info->flags.IdrPicFlag) {
2215*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, no_output_of_prior_pics_flag);
2216*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, long_term_reference_flag);
2217*61046927SAndroid Build Coastguard Worker } else {
2218*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, adaptive_ref_pic_marking_mode_flag);
2219*61046927SAndroid Build Coastguard Worker }
2220*61046927SAndroid Build Coastguard Worker }
2221*61046927SAndroid Build Coastguard Worker
2222*61046927SAndroid Build Coastguard Worker if (pps->flags.entropy_coding_mode_flag && (slice_type != STD_VIDEO_H264_SLICE_TYPE_I))
2223*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, slice_header->cabac_init_idc);
2224*61046927SAndroid Build Coastguard Worker
2225*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, slice_qp_delta);
2226*61046927SAndroid Build Coastguard Worker
2227*61046927SAndroid Build Coastguard Worker if (pps->flags.deblocking_filter_control_present_flag) {
2228*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, slice_header->disable_deblocking_filter_idc);
2229*61046927SAndroid Build Coastguard Worker
2230*61046927SAndroid Build Coastguard Worker if (slice_header->disable_deblocking_filter_idc != 1) {
2231*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, slice_header->slice_alpha_c0_offset_div2);
2232*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, slice_header->slice_beta_offset_div2);
2233*61046927SAndroid Build Coastguard Worker }
2234*61046927SAndroid Build Coastguard Worker }
2235*61046927SAndroid Build Coastguard Worker
2236*61046927SAndroid Build Coastguard Worker if (pps->flags.entropy_coding_mode_flag) {
2237*61046927SAndroid Build Coastguard Worker int left = vl_bitstream_get_num_bits_for_byte_align(&enc);
2238*61046927SAndroid Build Coastguard Worker int val = (1 << left) - 1;
2239*61046927SAndroid Build Coastguard Worker
2240*61046927SAndroid Build Coastguard Worker if (left)
2241*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, left, val);
2242*61046927SAndroid Build Coastguard Worker
2243*61046927SAndroid Build Coastguard Worker ASSERTED bool is_aligned = vl_bitstream_is_byte_aligned(&enc);
2244*61046927SAndroid Build Coastguard Worker assert(is_aligned);
2245*61046927SAndroid Build Coastguard Worker }
2246*61046927SAndroid Build Coastguard Worker
2247*61046927SAndroid Build Coastguard Worker vl_bitstream_flush(&enc);
2248*61046927SAndroid Build Coastguard Worker *data_size_ptr += vl_bitstream_get_byte_count(&enc);
2249*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_free(&enc);
2250*61046927SAndroid Build Coastguard Worker
2251*61046927SAndroid Build Coastguard Worker return;
2252*61046927SAndroid Build Coastguard Worker }
2253*61046927SAndroid Build Coastguard Worker
2254*61046927SAndroid Build Coastguard Worker void
vk_video_encode_h265_slice_header(const StdVideoEncodeH265PictureInfo * pic_info,const StdVideoH265VideoParameterSet * vps,const StdVideoH265SequenceParameterSet * sps,const StdVideoH265PictureParameterSet * pps,const StdVideoEncodeH265SliceSegmentHeader * slice_header,const int8_t slice_qp_delta,size_t * data_size_ptr,void * data_ptr)2255*61046927SAndroid Build Coastguard Worker vk_video_encode_h265_slice_header(const StdVideoEncodeH265PictureInfo *pic_info,
2256*61046927SAndroid Build Coastguard Worker const StdVideoH265VideoParameterSet *vps,
2257*61046927SAndroid Build Coastguard Worker const StdVideoH265SequenceParameterSet *sps,
2258*61046927SAndroid Build Coastguard Worker const StdVideoH265PictureParameterSet *pps,
2259*61046927SAndroid Build Coastguard Worker const StdVideoEncodeH265SliceSegmentHeader *slice_header,
2260*61046927SAndroid Build Coastguard Worker const int8_t slice_qp_delta,
2261*61046927SAndroid Build Coastguard Worker size_t *data_size_ptr,
2262*61046927SAndroid Build Coastguard Worker void *data_ptr)
2263*61046927SAndroid Build Coastguard Worker {
2264*61046927SAndroid Build Coastguard Worker struct vl_bitstream_encoder enc;
2265*61046927SAndroid Build Coastguard Worker uint32_t data_size = *data_size_ptr;
2266*61046927SAndroid Build Coastguard Worker
2267*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_clear(&enc, data_ptr, data_size, VL_BITSTREAM_MAX_BUFFER);
2268*61046927SAndroid Build Coastguard Worker emit_nalu_h265_header(&enc, vk_video_get_h265_nal_unit(pic_info));
2269*61046927SAndroid Build Coastguard Worker
2270*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.first_slice_segment_in_pic_flag);
2271*61046927SAndroid Build Coastguard Worker if (pic_info->flags.IrapPicFlag) {
2272*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pic_info->flags.no_output_of_prior_pics_flag);
2273*61046927SAndroid Build Coastguard Worker }
2274*61046927SAndroid Build Coastguard Worker
2275*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pic_info->pps_pic_parameter_set_id);
2276*61046927SAndroid Build Coastguard Worker
2277*61046927SAndroid Build Coastguard Worker if (!slice_header->flags.first_slice_segment_in_pic_flag) {
2278*61046927SAndroid Build Coastguard Worker unsigned size, num;
2279*61046927SAndroid Build Coastguard Worker unsigned bits_slice_segment_address = 0;
2280*61046927SAndroid Build Coastguard Worker
2281*61046927SAndroid Build Coastguard Worker if (pps->flags.dependent_slice_segments_enabled_flag)
2282*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.dependent_slice_segment_flag);
2283*61046927SAndroid Build Coastguard Worker
2284*61046927SAndroid Build Coastguard Worker size = 1 << (sps->log2_min_luma_coding_block_size_minus3 + 3 +
2285*61046927SAndroid Build Coastguard Worker sps->log2_diff_max_min_luma_coding_block_size);
2286*61046927SAndroid Build Coastguard Worker
2287*61046927SAndroid Build Coastguard Worker num = ((sps->pic_width_in_luma_samples + size - 1) / size) *
2288*61046927SAndroid Build Coastguard Worker ((sps->pic_height_in_luma_samples + size - 1) / size);
2289*61046927SAndroid Build Coastguard Worker
2290*61046927SAndroid Build Coastguard Worker while (num > (1 << bits_slice_segment_address))
2291*61046927SAndroid Build Coastguard Worker bits_slice_segment_address++;
2292*61046927SAndroid Build Coastguard Worker
2293*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, bits_slice_segment_address, slice_header->slice_segment_address);
2294*61046927SAndroid Build Coastguard Worker }
2295*61046927SAndroid Build Coastguard Worker
2296*61046927SAndroid Build Coastguard Worker if (slice_header->flags.dependent_slice_segment_flag)
2297*61046927SAndroid Build Coastguard Worker goto finish;
2298*61046927SAndroid Build Coastguard Worker
2299*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < pps->num_extra_slice_header_bits; ++i)
2300*61046927SAndroid Build Coastguard Worker /* slice_reserved_flag */
2301*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, 0);
2302*61046927SAndroid Build Coastguard Worker
2303*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, slice_header->slice_type);
2304*61046927SAndroid Build Coastguard Worker
2305*61046927SAndroid Build Coastguard Worker if (pps->flags.output_flag_present_flag)
2306*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pic_info->flags.pic_output_flag);
2307*61046927SAndroid Build Coastguard Worker
2308*61046927SAndroid Build Coastguard Worker if (sps->flags.separate_colour_plane_flag)
2309*61046927SAndroid Build Coastguard Worker /* colour_plane_id */
2310*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 2, 0);
2311*61046927SAndroid Build Coastguard Worker
2312*61046927SAndroid Build Coastguard Worker if (pic_info->pic_type != STD_VIDEO_H265_PICTURE_TYPE_IDR) {
2313*61046927SAndroid Build Coastguard Worker /* slice_pic_order_cnt_lsb */
2314*61046927SAndroid Build Coastguard Worker uint32_t slice_pic_order_cnt_lsb =
2315*61046927SAndroid Build Coastguard Worker pic_info->PicOrderCntVal & ((1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4)) - 1);
2316*61046927SAndroid Build Coastguard Worker
2317*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, sps->log2_max_pic_order_cnt_lsb_minus4 + 4, slice_pic_order_cnt_lsb);
2318*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pic_info->flags.short_term_ref_pic_set_sps_flag);
2319*61046927SAndroid Build Coastguard Worker
2320*61046927SAndroid Build Coastguard Worker if (!pic_info->flags.short_term_ref_pic_set_sps_flag) {
2321*61046927SAndroid Build Coastguard Worker const StdVideoH265ShortTermRefPicSet* st_rps = pic_info->pShortTermRefPicSet;
2322*61046927SAndroid Build Coastguard Worker unsigned num_st_rps = sps->num_short_term_ref_pic_sets;
2323*61046927SAndroid Build Coastguard Worker bool rps_predict = false;
2324*61046927SAndroid Build Coastguard Worker
2325*61046927SAndroid Build Coastguard Worker if (num_st_rps) {
2326*61046927SAndroid Build Coastguard Worker rps_predict = st_rps->flags.inter_ref_pic_set_prediction_flag;
2327*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, st_rps->flags.inter_ref_pic_set_prediction_flag);
2328*61046927SAndroid Build Coastguard Worker }
2329*61046927SAndroid Build Coastguard Worker
2330*61046927SAndroid Build Coastguard Worker if (rps_predict) {
2331*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, st_rps->delta_idx_minus1);
2332*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, st_rps->flags.delta_rps_sign);
2333*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, st_rps->abs_delta_rps_minus1);
2334*61046927SAndroid Build Coastguard Worker
2335*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i <= st_rps->num_negative_pics + st_rps->num_positive_pics; i++) {
2336*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, st_rps->used_by_curr_pic_flag);
2337*61046927SAndroid Build Coastguard Worker if (!st_rps->used_by_curr_pic_flag) {
2338*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, st_rps->use_delta_flag);
2339*61046927SAndroid Build Coastguard Worker }
2340*61046927SAndroid Build Coastguard Worker }
2341*61046927SAndroid Build Coastguard Worker } else {
2342*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, st_rps->num_negative_pics);
2343*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, st_rps->num_positive_pics);
2344*61046927SAndroid Build Coastguard Worker
2345*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < st_rps->num_negative_pics; i++) {
2346*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, st_rps->delta_poc_s0_minus1[i]);
2347*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, st_rps->used_by_curr_pic_s0_flag);
2348*61046927SAndroid Build Coastguard Worker }
2349*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < st_rps->num_positive_pics; i++) {
2350*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, st_rps->delta_poc_s1_minus1[i]);
2351*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, st_rps->used_by_curr_pic_s1_flag);
2352*61046927SAndroid Build Coastguard Worker }
2353*61046927SAndroid Build Coastguard Worker }
2354*61046927SAndroid Build Coastguard Worker } else {
2355*61046927SAndroid Build Coastguard Worker unsigned num_st_rps = sps->num_short_term_ref_pic_sets;
2356*61046927SAndroid Build Coastguard Worker
2357*61046927SAndroid Build Coastguard Worker int numbits = util_logbase2_ceil(num_st_rps);
2358*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, numbits, pic_info->short_term_ref_pic_set_idx);
2359*61046927SAndroid Build Coastguard Worker }
2360*61046927SAndroid Build Coastguard Worker
2361*61046927SAndroid Build Coastguard Worker if (sps->flags.long_term_ref_pics_present_flag) {
2362*61046927SAndroid Build Coastguard Worker const StdVideoEncodeH265LongTermRefPics* lt_pics = pic_info->pLongTermRefPics;
2363*61046927SAndroid Build Coastguard Worker unsigned num_lt_sps = 0;
2364*61046927SAndroid Build Coastguard Worker unsigned num_lt_pics = lt_pics->num_long_term_pics;
2365*61046927SAndroid Build Coastguard Worker
2366*61046927SAndroid Build Coastguard Worker if (sps->num_long_term_ref_pics_sps > 0) {
2367*61046927SAndroid Build Coastguard Worker num_lt_sps = lt_pics->num_long_term_sps;
2368*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, num_lt_sps);
2369*61046927SAndroid Build Coastguard Worker }
2370*61046927SAndroid Build Coastguard Worker
2371*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, num_lt_pics);
2372*61046927SAndroid Build Coastguard Worker
2373*61046927SAndroid Build Coastguard Worker unsigned num_refs = num_lt_sps + num_lt_pics;
2374*61046927SAndroid Build Coastguard Worker
2375*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_refs; i++) {
2376*61046927SAndroid Build Coastguard Worker if (i < num_lt_sps) {
2377*61046927SAndroid Build Coastguard Worker if (sps->num_long_term_ref_pics_sps > 1) {
2378*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, util_logbase2_ceil(sps->num_long_term_ref_pics_sps),
2379*61046927SAndroid Build Coastguard Worker lt_pics->lt_idx_sps[i]);
2380*61046927SAndroid Build Coastguard Worker }
2381*61046927SAndroid Build Coastguard Worker } else {
2382*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, sps->log2_max_pic_order_cnt_lsb_minus4 + 4,
2383*61046927SAndroid Build Coastguard Worker lt_pics->poc_lsb_lt[i]),
2384*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, lt_pics->used_by_curr_pic_lt_flag);
2385*61046927SAndroid Build Coastguard Worker }
2386*61046927SAndroid Build Coastguard Worker
2387*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, lt_pics->delta_poc_msb_present_flag[i]);
2388*61046927SAndroid Build Coastguard Worker if (lt_pics->delta_poc_msb_present_flag[i]) {
2389*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, lt_pics->delta_poc_msb_cycle_lt[i]);
2390*61046927SAndroid Build Coastguard Worker }
2391*61046927SAndroid Build Coastguard Worker }
2392*61046927SAndroid Build Coastguard Worker }
2393*61046927SAndroid Build Coastguard Worker
2394*61046927SAndroid Build Coastguard Worker if (sps->flags.sps_temporal_mvp_enabled_flag)
2395*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pic_info->flags.slice_temporal_mvp_enabled_flag);
2396*61046927SAndroid Build Coastguard Worker }
2397*61046927SAndroid Build Coastguard Worker
2398*61046927SAndroid Build Coastguard Worker if (sps->flags.sample_adaptive_offset_enabled_flag) {
2399*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.slice_sao_luma_flag);
2400*61046927SAndroid Build Coastguard Worker if (sps->chroma_format_idc)
2401*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.slice_sao_chroma_flag);
2402*61046927SAndroid Build Coastguard Worker }
2403*61046927SAndroid Build Coastguard Worker
2404*61046927SAndroid Build Coastguard Worker if (slice_header->slice_type != STD_VIDEO_H265_SLICE_TYPE_I) {
2405*61046927SAndroid Build Coastguard Worker unsigned num_ref_idx_l0_active = pps->num_ref_idx_l0_default_active_minus1 + 1;
2406*61046927SAndroid Build Coastguard Worker unsigned num_ref_idx_l1_active = pps->num_ref_idx_l1_default_active_minus1 + 1;
2407*61046927SAndroid Build Coastguard Worker
2408*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.num_ref_idx_active_override_flag);
2409*61046927SAndroid Build Coastguard Worker if (slice_header->flags.num_ref_idx_active_override_flag) {
2410*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pic_info->pRefLists->num_ref_idx_l0_active_minus1);
2411*61046927SAndroid Build Coastguard Worker num_ref_idx_l0_active = pic_info->pRefLists->num_ref_idx_l0_active_minus1 + 1;
2412*61046927SAndroid Build Coastguard Worker
2413*61046927SAndroid Build Coastguard Worker if (slice_header->slice_type == STD_VIDEO_H265_SLICE_TYPE_B) {
2414*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, pic_info->pRefLists->num_ref_idx_l1_active_minus1);
2415*61046927SAndroid Build Coastguard Worker num_ref_idx_l1_active = pic_info->pRefLists->num_ref_idx_l1_active_minus1 + 1;
2416*61046927SAndroid Build Coastguard Worker }
2417*61046927SAndroid Build Coastguard Worker }
2418*61046927SAndroid Build Coastguard Worker
2419*61046927SAndroid Build Coastguard Worker if (pps->flags.lists_modification_present_flag) {
2420*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pic_info->pRefLists->flags.ref_pic_list_modification_flag_l0);
2421*61046927SAndroid Build Coastguard Worker if (pic_info->pRefLists->flags.ref_pic_list_modification_flag_l0) {
2422*61046927SAndroid Build Coastguard Worker
2423*61046927SAndroid Build Coastguard Worker for (int i = 0; i < num_ref_idx_l0_active; i++) {
2424*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, util_logbase2_ceil(num_ref_idx_l0_active + num_ref_idx_l1_active),
2425*61046927SAndroid Build Coastguard Worker pic_info->pRefLists->list_entry_l0[i]);
2426*61046927SAndroid Build Coastguard Worker }
2427*61046927SAndroid Build Coastguard Worker }
2428*61046927SAndroid Build Coastguard Worker
2429*61046927SAndroid Build Coastguard Worker if (slice_header->slice_type == STD_VIDEO_H265_SLICE_TYPE_B) {
2430*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, pic_info->pRefLists->flags.ref_pic_list_modification_flag_l1);
2431*61046927SAndroid Build Coastguard Worker
2432*61046927SAndroid Build Coastguard Worker if (pic_info->pRefLists->flags.ref_pic_list_modification_flag_l1) {
2433*61046927SAndroid Build Coastguard Worker for (int i = 0; i < num_ref_idx_l1_active; i++) {
2434*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, util_logbase2_ceil(num_ref_idx_l0_active + num_ref_idx_l1_active),
2435*61046927SAndroid Build Coastguard Worker pic_info->pRefLists->list_entry_l1[i]);
2436*61046927SAndroid Build Coastguard Worker }
2437*61046927SAndroid Build Coastguard Worker }
2438*61046927SAndroid Build Coastguard Worker }
2439*61046927SAndroid Build Coastguard Worker }
2440*61046927SAndroid Build Coastguard Worker
2441*61046927SAndroid Build Coastguard Worker if (slice_header->slice_type == STD_VIDEO_H265_SLICE_TYPE_B)
2442*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.mvd_l1_zero_flag);
2443*61046927SAndroid Build Coastguard Worker
2444*61046927SAndroid Build Coastguard Worker if (pps->flags.cabac_init_present_flag)
2445*61046927SAndroid Build Coastguard Worker /* cabac_init_flag */
2446*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.cabac_init_flag);
2447*61046927SAndroid Build Coastguard Worker
2448*61046927SAndroid Build Coastguard Worker if (pic_info->flags.slice_temporal_mvp_enabled_flag) {
2449*61046927SAndroid Build Coastguard Worker unsigned collocated_list = 0;
2450*61046927SAndroid Build Coastguard Worker if (slice_header->slice_type == STD_VIDEO_H265_SLICE_TYPE_B) {
2451*61046927SAndroid Build Coastguard Worker collocated_list = 1;
2452*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, collocated_list);
2453*61046927SAndroid Build Coastguard Worker }
2454*61046927SAndroid Build Coastguard Worker
2455*61046927SAndroid Build Coastguard Worker if (collocated_list == 0) {
2456*61046927SAndroid Build Coastguard Worker if (num_ref_idx_l0_active > 1)
2457*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, slice_header->collocated_ref_idx);
2458*61046927SAndroid Build Coastguard Worker } else if (collocated_list == 1) {
2459*61046927SAndroid Build Coastguard Worker if (num_ref_idx_l1_active > 1)
2460*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, slice_header->collocated_ref_idx);
2461*61046927SAndroid Build Coastguard Worker }
2462*61046927SAndroid Build Coastguard Worker }
2463*61046927SAndroid Build Coastguard Worker
2464*61046927SAndroid Build Coastguard Worker if ((pps->flags.weighted_pred_flag && slice_header->slice_type == STD_VIDEO_H265_SLICE_TYPE_P) ||
2465*61046927SAndroid Build Coastguard Worker (pps->flags.weighted_bipred_flag && slice_header->slice_type == STD_VIDEO_H265_SLICE_TYPE_B)) {
2466*61046927SAndroid Build Coastguard Worker /* FIXME : h265_pred_weight_table */
2467*61046927SAndroid Build Coastguard Worker assert(0);
2468*61046927SAndroid Build Coastguard Worker }
2469*61046927SAndroid Build Coastguard Worker
2470*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_ue(&enc, 5 - slice_header->MaxNumMergeCand);
2471*61046927SAndroid Build Coastguard Worker }
2472*61046927SAndroid Build Coastguard Worker
2473*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, slice_qp_delta);
2474*61046927SAndroid Build Coastguard Worker
2475*61046927SAndroid Build Coastguard Worker if (pps->flags.pps_slice_chroma_qp_offsets_present_flag) {
2476*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, slice_header->slice_cb_qp_offset);
2477*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, slice_header->slice_cr_qp_offset);
2478*61046927SAndroid Build Coastguard Worker }
2479*61046927SAndroid Build Coastguard Worker
2480*61046927SAndroid Build Coastguard Worker if (pps->flags.chroma_qp_offset_list_enabled_flag)
2481*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.cu_chroma_qp_offset_enabled_flag);
2482*61046927SAndroid Build Coastguard Worker
2483*61046927SAndroid Build Coastguard Worker if (pps->flags.deblocking_filter_control_present_flag) {
2484*61046927SAndroid Build Coastguard Worker if (pps->flags.deblocking_filter_override_enabled_flag) {
2485*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.deblocking_filter_override_flag);
2486*61046927SAndroid Build Coastguard Worker
2487*61046927SAndroid Build Coastguard Worker if (slice_header->flags.deblocking_filter_override_flag) {
2488*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.slice_deblocking_filter_disabled_flag);
2489*61046927SAndroid Build Coastguard Worker
2490*61046927SAndroid Build Coastguard Worker if (!slice_header->flags.slice_deblocking_filter_disabled_flag) {
2491*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, slice_header->slice_beta_offset_div2);
2492*61046927SAndroid Build Coastguard Worker vl_bitstream_exp_golomb_se(&enc, slice_header->slice_tc_offset_div2);
2493*61046927SAndroid Build Coastguard Worker }
2494*61046927SAndroid Build Coastguard Worker }
2495*61046927SAndroid Build Coastguard Worker }
2496*61046927SAndroid Build Coastguard Worker }
2497*61046927SAndroid Build Coastguard Worker
2498*61046927SAndroid Build Coastguard Worker if (pps->flags.pps_loop_filter_across_slices_enabled_flag &&
2499*61046927SAndroid Build Coastguard Worker (slice_header->flags.slice_sao_luma_flag || slice_header->flags.slice_sao_chroma_flag ||
2500*61046927SAndroid Build Coastguard Worker !slice_header->flags.slice_deblocking_filter_disabled_flag))
2501*61046927SAndroid Build Coastguard Worker vl_bitstream_put_bits(&enc, 1, slice_header->flags.slice_loop_filter_across_slices_enabled_flag);
2502*61046927SAndroid Build Coastguard Worker
2503*61046927SAndroid Build Coastguard Worker if (pps->flags.tiles_enabled_flag || pps->flags.entropy_coding_sync_enabled_flag) {
2504*61046927SAndroid Build Coastguard Worker assert(0);
2505*61046927SAndroid Build Coastguard Worker }
2506*61046927SAndroid Build Coastguard Worker
2507*61046927SAndroid Build Coastguard Worker if (pps->flags.pps_extension_present_flag) {
2508*61046927SAndroid Build Coastguard Worker assert(0);
2509*61046927SAndroid Build Coastguard Worker }
2510*61046927SAndroid Build Coastguard Worker
2511*61046927SAndroid Build Coastguard Worker finish:
2512*61046927SAndroid Build Coastguard Worker vl_bitstream_rbsp_trailing(&enc);
2513*61046927SAndroid Build Coastguard Worker vl_bitstream_flush(&enc);
2514*61046927SAndroid Build Coastguard Worker *data_size_ptr += vl_bitstream_get_byte_count(&enc);
2515*61046927SAndroid Build Coastguard Worker vl_bitstream_encoder_free(&enc);
2516*61046927SAndroid Build Coastguard Worker
2517*61046927SAndroid Build Coastguard Worker return;
2518*61046927SAndroid Build Coastguard Worker }
2519