xref: /aosp_15_r20/external/mesa3d/src/vulkan/runtime/vk_video.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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 &params->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(&params->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(&params->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, &params->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(&params->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(&params->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