• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright 2016 Advanced Micro Devices, Inc.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sub license, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial portions
16  * of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21  * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  **************************************************************************/
27 
28 #include "pipe/p_video_codec.h"
29 #include "util/u_memory.h"
30 #include "util/u_video.h"
31 #include "vl/vl_rbsp.h"
32 
33 #include "entrypoint.h"
34 #include "vid_dec.h"
35 
36 #define DPB_MAX_SIZE 32
37 #define MAX_NUM_REF_PICS 16
38 
39 enum {
40    NAL_UNIT_TYPE_TRAIL_N = 0,
41    NAL_UNIT_TYPE_TRAIL_R = 1,
42    NAL_UNIT_TYPE_TSA_N = 2,
43    NAL_UNIT_TYPE_TSA_R = 3,
44    NAL_UNIT_TYPE_STSA_N = 4,
45    NAL_UNIT_TYPE_STSA_R = 5,
46    NAL_UNIT_TYPE_RADL_N = 6,
47    NAL_UNIT_TYPE_RADL_R = 7,
48    NAL_UNIT_TYPE_RASL_N = 8,
49    NAL_UNIT_TYPE_RASL_R = 9,
50    NAL_UNIT_TYPE_BLA_W_LP = 16,
51    NAL_UNIT_TYPE_BLA_W_RADL = 17,
52    NAL_UNIT_TYPE_BLA_N_LP =  18,
53    NAL_UNIT_TYPE_IDR_W_RADL = 19,
54    NAL_UNIT_TYPE_IDR_N_LP = 20,
55    NAL_UNIT_TYPE_CRA = 21,
56    NAL_UNIT_TYPE_SPS = 33,
57    NAL_UNIT_TYPE_PPS = 34,
58 };
59 
60 static const uint8_t Default_8x8_Intra[64] = {
61    16, 16, 16, 16, 17, 18, 21, 24,
62    16, 16, 16, 16, 17, 19, 22, 25,
63    16, 16, 17, 18, 20, 22, 25, 29,
64    16, 16, 18, 21, 24, 27, 31, 36,
65    17, 17, 20, 24, 30, 35, 41, 47,
66    18, 19, 22, 27, 35, 44, 54, 65,
67    21, 22, 25, 31, 41, 54, 70, 88,
68    24, 25, 29, 36, 47, 65, 88, 115
69 };
70 
71 static const uint8_t Default_8x8_Inter[64] = {
72    16, 16, 16, 16, 17, 18, 20, 24,
73    16, 16, 16, 17, 18, 20, 24, 25,
74    16, 16, 17, 18, 20, 24, 25, 28,
75    16, 17, 18, 20, 24, 25, 28, 33,
76    17, 18, 20, 24, 25, 28, 33, 41,
77    18, 20, 24, 25, 28, 33, 41, 54,
78    20, 24, 25, 28, 33, 41, 54, 71,
79    24, 25, 28, 33, 41, 54, 71, 91
80 };
81 
82 struct dpb_list {
83    struct list_head list;
84    struct pipe_video_buffer *buffer;
85    OMX_TICKS timestamp;
86    unsigned poc;
87 };
88 
89 struct ref_pic_set {
90   unsigned  num_pics;
91   unsigned  num_neg_pics;
92   unsigned  num_pos_pics;
93   unsigned  num_delta_poc;
94   int  delta_poc[MAX_NUM_REF_PICS];
95   bool used[MAX_NUM_REF_PICS];
96 };
97 
is_idr_picture(unsigned nal_unit_type)98 static bool is_idr_picture(unsigned nal_unit_type)
99 {
100    return (nal_unit_type == NAL_UNIT_TYPE_IDR_W_RADL ||
101            nal_unit_type == NAL_UNIT_TYPE_IDR_N_LP);
102 }
103 
104 /* broken link access picture */
is_bla_picture(unsigned nal_unit_type)105 static bool is_bla_picture(unsigned nal_unit_type)
106 {
107    return (nal_unit_type == NAL_UNIT_TYPE_BLA_W_LP ||
108            nal_unit_type == NAL_UNIT_TYPE_BLA_W_RADL ||
109            nal_unit_type == NAL_UNIT_TYPE_BLA_N_LP);
110 }
111 
112 /* random access point picture */
is_rap_picture(unsigned nal_unit_type)113 static bool is_rap_picture(unsigned nal_unit_type)
114 {
115    return (nal_unit_type >= NAL_UNIT_TYPE_BLA_W_LP &&
116            nal_unit_type <= NAL_UNIT_TYPE_CRA);
117 }
118 
is_slice_picture(unsigned nal_unit_type)119 static bool is_slice_picture(unsigned nal_unit_type)
120 {
121    return (nal_unit_type <= NAL_UNIT_TYPE_RASL_R ||
122            is_rap_picture(nal_unit_type));
123 }
124 
set_poc(vid_dec_PrivateType * priv,unsigned nal_unit_type,int i)125 static void set_poc(vid_dec_PrivateType *priv,
126                     unsigned nal_unit_type, int i)
127 {
128    priv->picture.h265.CurrPicOrderCntVal = i;
129 
130    if (priv->codec_data.h265.temporal_id == 0 &&
131        (nal_unit_type == NAL_UNIT_TYPE_TRAIL_R ||
132         nal_unit_type == NAL_UNIT_TYPE_TSA_R ||
133         nal_unit_type == NAL_UNIT_TYPE_STSA_R ||
134         is_rap_picture(nal_unit_type)))
135       priv->codec_data.h265.slice_prev_poc = i;
136 }
137 
get_poc(vid_dec_PrivateType * priv)138 static unsigned get_poc(vid_dec_PrivateType *priv)
139 {
140    return priv->picture.h265.CurrPicOrderCntVal;
141 }
142 
profile_tier(struct vl_rbsp * rbsp)143 static void profile_tier(struct vl_rbsp *rbsp)
144 {
145    int i;
146 
147    /* general_profile_space */
148    vl_rbsp_u(rbsp, 2);
149 
150    /* general_tier_flag */
151    vl_rbsp_u(rbsp, 1);
152 
153    /* general_profile_idc */
154    vl_rbsp_u(rbsp, 5);
155 
156    /* general_profile_compatibility_flag */
157    for(i = 0; i < 32; ++i)
158       vl_rbsp_u(rbsp, 1);
159 
160    /* general_progressive_source_flag */
161    vl_rbsp_u(rbsp, 1);
162 
163    /* general_interlaced_source_flag */
164    vl_rbsp_u(rbsp, 1);
165 
166    /* general_non_packed_constraint_flag */
167    vl_rbsp_u(rbsp, 1);
168 
169    /* general_frame_only_constraint_flag */
170    vl_rbsp_u(rbsp, 1);
171 
172    /* general_reserved_zero_44bits */
173    vl_rbsp_u(rbsp, 16);
174    vl_rbsp_u(rbsp, 16);
175    vl_rbsp_u(rbsp, 12);
176 }
177 
profile_tier_level(struct vl_rbsp * rbsp,int max_sublayers_minus1)178 static unsigned profile_tier_level(struct vl_rbsp *rbsp,
179                                    int max_sublayers_minus1)
180 {
181    bool sub_layer_profile_present_flag[6];
182    bool sub_layer_level_present_flag[6];
183    unsigned level_idc;
184    int i;
185 
186    profile_tier(rbsp);
187 
188    /* general_level_idc */
189    level_idc = vl_rbsp_u(rbsp, 8);
190 
191    for (i = 0; i < max_sublayers_minus1; ++i) {
192       sub_layer_profile_present_flag[i] = vl_rbsp_u(rbsp, 1);
193       sub_layer_level_present_flag[i] = vl_rbsp_u(rbsp, 1);
194    }
195 
196    if (max_sublayers_minus1 > 0)
197       for (i = max_sublayers_minus1; i < 8; ++i)
198          /* reserved_zero_2bits */
199          vl_rbsp_u(rbsp, 2);
200 
201    for (i = 0; i < max_sublayers_minus1; ++i) {
202       if (sub_layer_profile_present_flag[i])
203          profile_tier(rbsp);
204 
205       if (sub_layer_level_present_flag[i])
206          /* sub_layer_level_idc */
207          vl_rbsp_u(rbsp, 8);
208    }
209 
210    return level_idc;
211 }
212 
scaling_list_data(vid_dec_PrivateType * priv,struct vl_rbsp * rbsp,struct pipe_h265_sps * sps)213 static void scaling_list_data(vid_dec_PrivateType *priv,
214                               struct vl_rbsp *rbsp, struct pipe_h265_sps *sps)
215 {
216    unsigned size_id, matrix_id;
217    unsigned scaling_list_len[4] = { 16, 64, 64, 64 };
218    uint8_t scaling_list4x4[6][64] = {  };
219    int i;
220 
221    uint8_t (*scaling_list_data[4])[6][64] = {
222         (uint8_t (*)[6][64])scaling_list4x4,
223         (uint8_t (*)[6][64])sps->ScalingList8x8,
224         (uint8_t (*)[6][64])sps->ScalingList16x16,
225         (uint8_t (*)[6][64])sps->ScalingList32x32
226    };
227    uint8_t (*scaling_list_dc_coeff[2])[6] = {
228       (uint8_t (*)[6])sps->ScalingListDCCoeff16x16,
229       (uint8_t (*)[6])sps->ScalingListDCCoeff32x32
230    };
231 
232    for (size_id = 0; size_id < 4; ++size_id) {
233 
234       for (matrix_id = 0; matrix_id < ((size_id == 3) ? 2 : 6); ++matrix_id) {
235          bool scaling_list_pred_mode_flag = vl_rbsp_u(rbsp, 1);
236 
237          if (!scaling_list_pred_mode_flag) {
238             /* scaling_list_pred_matrix_id_delta */;
239             unsigned matrix_id_with_delta = matrix_id - vl_rbsp_ue(rbsp);
240 
241             if (matrix_id != matrix_id_with_delta) {
242                memcpy((*scaling_list_data[size_id])[matrix_id],
243                       (*scaling_list_data[size_id])[matrix_id_with_delta],
244                       scaling_list_len[size_id]);
245                if (size_id > 1)
246                   (*scaling_list_dc_coeff[size_id - 2])[matrix_id] =
247                      (*scaling_list_dc_coeff[size_id - 2])[matrix_id_with_delta];
248             } else {
249                const uint8_t *d;
250 
251                if (size_id == 0)
252                   memset((*scaling_list_data[0])[matrix_id], 16, 16);
253                else {
254                   if (size_id < 3)
255                      d = (matrix_id < 3) ? Default_8x8_Intra : Default_8x8_Inter;
256                   else
257                      d = (matrix_id < 1) ? Default_8x8_Intra : Default_8x8_Inter;
258                   memcpy((*scaling_list_data[size_id])[matrix_id], d,
259                          scaling_list_len[size_id]);
260                }
261                if (size_id > 1)
262                   (*scaling_list_dc_coeff[size_id - 2])[matrix_id] = 16;
263             }
264          } else {
265             int next_coef = 8;
266             int coef_num = MIN2(64, (1 << (4 + (size_id << 1))));
267 
268             if (size_id > 1) {
269                /* scaling_list_dc_coef_minus8 */
270                next_coef = vl_rbsp_se(rbsp) + 8;
271                (*scaling_list_dc_coeff[size_id - 2])[matrix_id] = next_coef;
272             }
273 
274             for (i = 0; i < coef_num; ++i) {
275                /* scaling_list_delta_coef */
276                next_coef = (next_coef + vl_rbsp_se(rbsp) + 256) % 256;
277                (*scaling_list_data[size_id])[matrix_id][i] = next_coef;
278             }
279          }
280       }
281    }
282 
283    for (i = 0; i < 6; ++i)
284       memcpy(sps->ScalingList4x4[i], scaling_list4x4[i], 16);
285 
286    return;
287 }
288 
st_ref_pic_set(vid_dec_PrivateType * priv,struct vl_rbsp * rbsp,struct ref_pic_set * rps,struct pipe_h265_sps * sps,unsigned idx)289 static void st_ref_pic_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
290                            struct ref_pic_set *rps, struct pipe_h265_sps *sps,
291                            unsigned idx)
292 {
293    bool inter_rps_pred_flag;
294    unsigned delta_idx_minus1;
295    int delta_poc;
296    int i;
297 
298    inter_rps_pred_flag = (idx != 0) ? (vl_rbsp_u(rbsp, 1)) : false;
299 
300    if (inter_rps_pred_flag) {
301       struct ref_pic_set *ref_rps;
302       unsigned sign, abs;
303       int delta_rps;
304       bool used;
305       int j;
306 
307       if (idx == sps->num_short_term_ref_pic_sets)
308          delta_idx_minus1 = vl_rbsp_ue(rbsp);
309       else
310          delta_idx_minus1 = 0;
311 
312       ref_rps = (struct ref_pic_set *)
313          priv->codec_data.h265.ref_pic_set_list + idx - (delta_idx_minus1 + 1);
314 
315       /* delta_rps_sign */
316       sign = vl_rbsp_u(rbsp, 1);
317       /* abs_delta_rps_minus1 */
318       abs = vl_rbsp_ue(rbsp);
319       delta_rps = (1 - 2 * sign) * (abs + 1);
320 
321       rps->num_neg_pics = 0;
322       rps->num_pos_pics = 0;
323       rps->num_pics = 0;
324 
325       for(i = 0 ; i <= ref_rps->num_pics; ++i) {
326          /* used_by_curr_pic_flag */
327          if (!vl_rbsp_u(rbsp, 1))
328             /* use_delta_flag */
329             vl_rbsp_u(rbsp, 1);
330          else {
331             delta_poc = delta_rps +
332                ((i < ref_rps->num_pics)? ref_rps->delta_poc[i] : 0);
333             rps->delta_poc[rps->num_pics] = delta_poc;
334             rps->used[rps->num_pics] = true;
335             if (delta_poc < 0)
336                rps->num_neg_pics++;
337             else
338                rps->num_pos_pics++;
339             rps->num_pics++;
340          }
341       }
342 
343       rps->num_delta_poc = ref_rps->num_pics;
344 
345       /* sort delta poc */
346       for (i = 1; i < rps->num_pics; ++i) {
347          delta_poc = rps->delta_poc[i];
348          used = rps->used[i];
349          for (j = i - 1; j >= 0; j--) {
350             if (delta_poc < rps->delta_poc[j]) {
351                rps->delta_poc[j + 1] = rps->delta_poc[j];
352                rps->used[j + 1] = rps->used[j];
353                rps->delta_poc[j] = delta_poc;
354                rps->used[j] = used;
355             }
356          }
357       }
358 
359       for (i = 0 , j = rps->num_neg_pics - 1;
360            i < rps->num_neg_pics >> 1; i++, j--) {
361          delta_poc = rps->delta_poc[i];
362          used = rps->used[i];
363          rps->delta_poc[i] = rps->delta_poc[j];
364          rps->used[i] = rps->used[j];
365          rps->delta_poc[j] = delta_poc;
366          rps->used[j] = used;
367       }
368    } else {
369       /* num_negative_pics */
370       rps->num_neg_pics = vl_rbsp_ue(rbsp);
371       /* num_positive_pics */
372       rps->num_pos_pics = vl_rbsp_ue(rbsp);
373       rps->num_pics = rps->num_neg_pics + rps->num_pos_pics;
374 
375       delta_poc = 0;
376       for(i = 0 ; i < rps->num_neg_pics; ++i) {
377          /* delta_poc_s0_minus1 */
378          delta_poc -= (vl_rbsp_ue(rbsp) + 1);
379          rps->delta_poc[i] = delta_poc;
380          /* used_by_curr_pic_s0_flag */
381          rps->used[i] = vl_rbsp_u(rbsp, 1);
382       }
383 
384       delta_poc = 0;
385       for(i = rps->num_neg_pics; i < rps->num_pics; ++i) {
386          /* delta_poc_s1_minus1 */
387          delta_poc += (vl_rbsp_ue(rbsp) + 1);
388          rps->delta_poc[i] = delta_poc;
389          /* used_by_curr_pic_s1_flag */
390          rps->used[i] = vl_rbsp_u(rbsp, 1);
391       }
392    }
393 }
394 
seq_parameter_set_id(vid_dec_PrivateType * priv,struct vl_rbsp * rbsp)395 static struct pipe_h265_sps *seq_parameter_set_id(vid_dec_PrivateType *priv,
396                                                   struct vl_rbsp *rbsp)
397 {
398    unsigned id = vl_rbsp_ue(rbsp);
399 
400    if (id >= ARRAY_SIZE(priv->codec_data.h265.sps))
401       return NULL;
402 
403    return &priv->codec_data.h265.sps[id];
404 }
405 
seq_parameter_set(vid_dec_PrivateType * priv,struct vl_rbsp * rbsp)406 static void seq_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
407 {
408    struct pipe_h265_sps *sps;
409    int sps_max_sub_layers_minus1;
410    unsigned i;
411 
412    /* sps_video_parameter_set_id */
413    vl_rbsp_u(rbsp, 4);
414 
415    /* sps_max_sub_layers_minus1 */
416    sps_max_sub_layers_minus1 = vl_rbsp_u(rbsp, 3);
417 
418    assert(sps_max_sub_layers_minus1 <= 6);
419 
420    /* sps_temporal_id_nesting_flag */
421    vl_rbsp_u(rbsp, 1);
422 
423    priv->codec_data.h265.level_idc =
424       profile_tier_level(rbsp, sps_max_sub_layers_minus1);
425 
426    sps = seq_parameter_set_id(priv, rbsp);
427    if (!sps)
428       return;
429 
430    memset(sps, 0, sizeof(*sps));
431 
432    sps->chroma_format_idc = vl_rbsp_ue(rbsp);
433 
434    if (sps->chroma_format_idc == 3)
435       sps->separate_colour_plane_flag = vl_rbsp_u(rbsp, 1);
436 
437    priv->codec_data.h265.pic_width_in_luma_samples =
438       sps->pic_width_in_luma_samples = vl_rbsp_ue(rbsp);
439 
440    priv->codec_data.h265.pic_height_in_luma_samples =
441       sps->pic_height_in_luma_samples = vl_rbsp_ue(rbsp);
442 
443    /* conformance_window_flag */
444    if (vl_rbsp_u(rbsp, 1)) {
445       /* conf_win_left_offset */
446       vl_rbsp_ue(rbsp);
447       /* conf_win_right_offset */
448       vl_rbsp_ue(rbsp);
449       /* conf_win_top_offset */
450       vl_rbsp_ue(rbsp);
451       /* conf_win_bottom_offset */
452       vl_rbsp_ue(rbsp);
453    }
454 
455    sps->bit_depth_luma_minus8 = vl_rbsp_ue(rbsp);
456    sps->bit_depth_chroma_minus8 = vl_rbsp_ue(rbsp);
457    sps->log2_max_pic_order_cnt_lsb_minus4 = vl_rbsp_ue(rbsp);
458 
459    /* sps_sub_layer_ordering_info_present_flag */
460    i  = vl_rbsp_u(rbsp, 1) ? 0 : sps_max_sub_layers_minus1;
461    for (; i <= sps_max_sub_layers_minus1; ++i) {
462       sps->sps_max_dec_pic_buffering_minus1 = vl_rbsp_ue(rbsp);
463       /* sps_max_num_reorder_pics */
464       vl_rbsp_ue(rbsp);
465       /* sps_max_latency_increase_plus */
466       vl_rbsp_ue(rbsp);
467    }
468 
469    sps->log2_min_luma_coding_block_size_minus3 = vl_rbsp_ue(rbsp);
470    sps->log2_diff_max_min_luma_coding_block_size = vl_rbsp_ue(rbsp);
471    sps->log2_min_transform_block_size_minus2 = vl_rbsp_ue(rbsp);
472    sps->log2_diff_max_min_transform_block_size = vl_rbsp_ue(rbsp);
473    sps->max_transform_hierarchy_depth_inter = vl_rbsp_ue(rbsp);
474    sps->max_transform_hierarchy_depth_intra = vl_rbsp_ue(rbsp);
475 
476    sps->scaling_list_enabled_flag = vl_rbsp_u(rbsp, 1);
477    if (sps->scaling_list_enabled_flag)
478       /* sps_scaling_list_data_present_flag */
479       if (vl_rbsp_u(rbsp, 1))
480          scaling_list_data(priv, rbsp, sps);
481 
482    sps->amp_enabled_flag = vl_rbsp_u(rbsp, 1);
483    sps->sample_adaptive_offset_enabled_flag = vl_rbsp_u(rbsp, 1);
484    sps->pcm_enabled_flag = vl_rbsp_u(rbsp, 1);
485    if (sps->pcm_enabled_flag) {
486       sps->pcm_sample_bit_depth_luma_minus1 = vl_rbsp_u(rbsp, 4);
487       sps->pcm_sample_bit_depth_chroma_minus1 = vl_rbsp_u(rbsp, 4);
488       sps->log2_min_pcm_luma_coding_block_size_minus3 = vl_rbsp_ue(rbsp);
489       sps->log2_diff_max_min_pcm_luma_coding_block_size = vl_rbsp_ue(rbsp);
490       sps->pcm_loop_filter_disabled_flag = vl_rbsp_u(rbsp, 1);
491    }
492 
493    sps->num_short_term_ref_pic_sets = vl_rbsp_ue(rbsp);
494 
495    for (i = 0; i < sps->num_short_term_ref_pic_sets; ++i) {
496       struct ref_pic_set *rps;
497 
498       rps = (struct ref_pic_set *)
499          priv->codec_data.h265.ref_pic_set_list + i;
500       st_ref_pic_set(priv, rbsp, rps, sps, i);
501    }
502 
503    sps->long_term_ref_pics_present_flag = vl_rbsp_u(rbsp, 1);
504    if (sps->long_term_ref_pics_present_flag) {
505       sps->num_long_term_ref_pics_sps = vl_rbsp_ue(rbsp);
506       for (i = 0; i < sps->num_long_term_ref_pics_sps; ++i) {
507          /* lt_ref_pic_poc_lsb_sps */
508          vl_rbsp_u(rbsp, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
509          /* used_by_curr_pic_lt_sps_flag */
510          vl_rbsp_u(rbsp, 1);
511       }
512    }
513 
514    sps->sps_temporal_mvp_enabled_flag = vl_rbsp_u(rbsp, 1);
515    sps->strong_intra_smoothing_enabled_flag = vl_rbsp_u(rbsp, 1);
516 }
517 
pic_parameter_set_id(vid_dec_PrivateType * priv,struct vl_rbsp * rbsp)518 static struct pipe_h265_pps *pic_parameter_set_id(vid_dec_PrivateType *priv,
519                                                   struct vl_rbsp *rbsp)
520 {
521    unsigned id = vl_rbsp_ue(rbsp);
522 
523    if (id >= ARRAY_SIZE(priv->codec_data.h265.pps))
524       return NULL;
525 
526    return &priv->codec_data.h265.pps[id];
527 }
528 
picture_parameter_set(vid_dec_PrivateType * priv,struct vl_rbsp * rbsp)529 static void picture_parameter_set(vid_dec_PrivateType *priv,
530                                   struct vl_rbsp *rbsp)
531 {
532    struct pipe_h265_sps *sps;
533    struct pipe_h265_pps *pps;
534    int i;
535 
536    pps = pic_parameter_set_id(priv, rbsp);
537    if (!pps)
538       return;
539 
540    memset(pps, 0, sizeof(*pps));
541    sps = pps->sps = seq_parameter_set_id(priv, rbsp);
542    if (!sps)
543       return;
544 
545    pps->dependent_slice_segments_enabled_flag = vl_rbsp_u(rbsp, 1);
546    pps->output_flag_present_flag = vl_rbsp_u(rbsp, 1);
547    pps->num_extra_slice_header_bits = vl_rbsp_u(rbsp, 3);
548    pps->sign_data_hiding_enabled_flag = vl_rbsp_u(rbsp, 1);
549    pps->cabac_init_present_flag = vl_rbsp_u(rbsp, 1);
550 
551    pps->num_ref_idx_l0_default_active_minus1 = vl_rbsp_ue(rbsp);
552    pps->num_ref_idx_l1_default_active_minus1 = vl_rbsp_ue(rbsp);
553    pps->init_qp_minus26 = vl_rbsp_se(rbsp);
554    pps->constrained_intra_pred_flag = vl_rbsp_u(rbsp, 1);
555    pps->transform_skip_enabled_flag = vl_rbsp_u(rbsp, 1);
556 
557    pps->cu_qp_delta_enabled_flag = vl_rbsp_u(rbsp, 1);
558    if (pps->cu_qp_delta_enabled_flag)
559       pps->diff_cu_qp_delta_depth = vl_rbsp_ue(rbsp);
560 
561    pps->pps_cb_qp_offset = vl_rbsp_se(rbsp);
562    pps->pps_cr_qp_offset = vl_rbsp_se(rbsp);
563    pps->pps_slice_chroma_qp_offsets_present_flag = vl_rbsp_u(rbsp, 1);
564 
565    pps->weighted_pred_flag = vl_rbsp_u(rbsp, 1);
566    pps->weighted_bipred_flag = vl_rbsp_u(rbsp, 1);
567 
568    pps->transquant_bypass_enabled_flag = vl_rbsp_u(rbsp, 1);
569    pps->tiles_enabled_flag = vl_rbsp_u(rbsp, 1);
570    pps->entropy_coding_sync_enabled_flag = vl_rbsp_u(rbsp, 1);
571 
572    if (pps->tiles_enabled_flag) {
573       pps->num_tile_columns_minus1 = vl_rbsp_ue(rbsp);
574       pps->num_tile_rows_minus1 = vl_rbsp_ue(rbsp);
575 
576       pps->uniform_spacing_flag = vl_rbsp_u(rbsp, 1);
577       if (!pps->uniform_spacing_flag) {
578          for (i = 0; i < pps->num_tile_columns_minus1; ++i)
579             pps->column_width_minus1[i] = vl_rbsp_ue(rbsp);
580 
581          for (i = 0; i < pps->num_tile_rows_minus1; ++i)
582             pps->row_height_minus1[i] = vl_rbsp_ue(rbsp);
583       }
584 
585       if (!pps->num_tile_columns_minus1 || !pps->num_tile_rows_minus1)
586          pps->loop_filter_across_tiles_enabled_flag = vl_rbsp_u(rbsp, 1);
587    }
588 
589    pps->pps_loop_filter_across_slices_enabled_flag = vl_rbsp_u(rbsp, 1);
590 
591    pps->deblocking_filter_control_present_flag = vl_rbsp_u(rbsp, 1);
592    if (pps->deblocking_filter_control_present_flag) {
593       pps->deblocking_filter_override_enabled_flag = vl_rbsp_u(rbsp, 1);
594       pps->pps_deblocking_filter_disabled_flag = vl_rbsp_u(rbsp, 1);
595       if (!pps->pps_deblocking_filter_disabled_flag) {
596          pps->pps_beta_offset_div2 = vl_rbsp_se(rbsp);
597          pps->pps_tc_offset_div2 = vl_rbsp_se(rbsp);
598       }
599    }
600 
601    if (vl_vlc_bits_left(&rbsp->nal) == 0)
602       return;
603 
604    /* pps_scaling_list_data_present_flag */
605    if (vl_rbsp_u(rbsp, 1))
606       scaling_list_data(priv, rbsp, sps);
607 
608    pps->lists_modification_present_flag = vl_rbsp_u(rbsp, 1);
609    pps->log2_parallel_merge_level_minus2 = vl_rbsp_ue(rbsp);
610    pps->slice_segment_header_extension_present_flag = vl_rbsp_u(rbsp, 1);
611 }
612 
vid_dec_h265_BeginFrame(vid_dec_PrivateType * priv)613 static void vid_dec_h265_BeginFrame(vid_dec_PrivateType *priv)
614 {
615    if (priv->frame_started)
616       return;
617 
618    if (!priv->codec) {
619       struct pipe_video_codec templat = {};
620       omx_base_video_PortType *port = (omx_base_video_PortType *)
621          priv->ports[OMX_BASE_FILTER_INPUTPORT_INDEX];
622 
623       templat.profile = priv->profile;
624       templat.entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM;
625       templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
626       templat.expect_chunked_decode = true;
627       templat.width = priv->codec_data.h265.pic_width_in_luma_samples;
628       templat.height = priv->codec_data.h265.pic_height_in_luma_samples;
629       templat.level =  priv->codec_data.h265.level_idc;
630       priv->codec = priv->pipe->create_video_codec(priv->pipe, &templat);
631 
632       /* disable transcode tunnel if video size is different from coded size */
633       if (priv->codec_data.h265.pic_width_in_luma_samples !=
634           port->sPortParam.format.video.nFrameWidth ||
635           priv->codec_data.h265.pic_height_in_luma_samples !=
636           port->sPortParam.format.video.nFrameHeight)
637          priv->disable_tunnel = true;
638    }
639 
640    vid_dec_NeedTarget(priv);
641 
642    if (priv->first_buf_in_frame)
643       priv->timestamp = priv->timestamps[0];
644    priv->first_buf_in_frame = false;
645 
646    priv->codec->begin_frame(priv->codec, priv->target, &priv->picture.base);
647    priv->frame_started = true;
648 }
649 
vid_dec_h265_Flush(vid_dec_PrivateType * priv,OMX_TICKS * timestamp)650 static struct pipe_video_buffer *vid_dec_h265_Flush(vid_dec_PrivateType *priv,
651                                                     OMX_TICKS *timestamp)
652 {
653    struct dpb_list *entry, *result = NULL;
654    struct pipe_video_buffer *buf;
655 
656    /* search for the lowest poc and break on zeros */
657    LIST_FOR_EACH_ENTRY(entry, &priv->codec_data.h265.dpb_list, list) {
658 
659       if (result && entry->poc == 0)
660          break;
661 
662       if (!result || entry->poc < result->poc)
663          result = entry;
664    }
665 
666    if (!result)
667       return NULL;
668 
669    buf = result->buffer;
670    if (timestamp)
671       *timestamp = result->timestamp;
672 
673    --priv->codec_data.h265.dpb_num;
674    list_del(&result->list);
675    FREE(result);
676 
677    return buf;
678 }
679 
vid_dec_h265_EndFrame(vid_dec_PrivateType * priv)680 static void vid_dec_h265_EndFrame(vid_dec_PrivateType *priv)
681 {
682    struct dpb_list *entry = NULL;
683    struct pipe_video_buffer *tmp;
684    struct ref_pic_set *rps;
685    int i;
686    OMX_TICKS timestamp;
687 
688    if (!priv->frame_started)
689       return;
690 
691    priv->picture.h265.NumPocStCurrBefore = 0;
692    priv->picture.h265.NumPocStCurrAfter = 0;
693    memset(priv->picture.h265.RefPicSetStCurrBefore, 0, 8);
694    memset(priv->picture.h265.RefPicSetStCurrAfter, 0, 8);
695    for (i = 0; i < MAX_NUM_REF_PICS; ++i) {
696       priv->picture.h265.ref[i] = NULL;
697       priv->picture.h265.PicOrderCntVal[i] = 0;
698    }
699 
700    rps = priv->codec_data.h265.rps;
701 
702    if (rps) {
703       unsigned bf = 0, af = 0;
704 
705       priv->picture.h265.NumDeltaPocsOfRefRpsIdx = rps->num_delta_poc;
706       for (i = 0; i < rps->num_pics; ++i) {
707          priv->picture.h265.PicOrderCntVal[i] =
708             rps->delta_poc[i] + get_poc(priv);
709 
710          LIST_FOR_EACH_ENTRY(entry, &priv->codec_data.h265.dpb_list, list) {
711             if (entry->poc == priv->picture.h265.PicOrderCntVal[i]) {
712                priv->picture.h265.ref[i] = entry->buffer;
713                break;
714             }
715          }
716 
717          if (rps->used[i]) {
718             if (i < rps->num_neg_pics) {
719                priv->picture.h265.NumPocStCurrBefore++;
720                priv->picture.h265.RefPicSetStCurrBefore[bf++] = i;
721             } else {
722                priv->picture.h265.NumPocStCurrAfter++;
723                priv->picture.h265.RefPicSetStCurrAfter[af++] = i;
724             }
725          }
726       }
727    }
728 
729    priv->codec->end_frame(priv->codec, priv->target, &priv->picture.base);
730    priv->frame_started = false;
731 
732    /* add the decoded picture to the dpb list */
733    entry = CALLOC_STRUCT(dpb_list);
734    if (!entry)
735       return;
736 
737    priv->first_buf_in_frame = true;
738    entry->buffer = priv->target;
739    entry->timestamp = priv->timestamp;
740    entry->poc = get_poc(priv);
741 
742    list_addtail(&entry->list, &priv->codec_data.h265.dpb_list);
743    ++priv->codec_data.h265.dpb_num;
744    priv->target = NULL;
745 
746    if (priv->codec_data.h265.dpb_num <= DPB_MAX_SIZE)
747       return;
748 
749    tmp = priv->in_buffers[0]->pInputPortPrivate;
750    priv->in_buffers[0]->pInputPortPrivate = vid_dec_h265_Flush(priv, &timestamp);
751    priv->in_buffers[0]->nTimeStamp = timestamp;
752    priv->target = tmp;
753    priv->frame_finished = priv->in_buffers[0]->pInputPortPrivate != NULL;
754    if (priv->frame_finished &&
755        (priv->in_buffers[0]->nFlags & OMX_BUFFERFLAG_EOS))
756       FREE(priv->codec_data.h265.ref_pic_set_list);
757 }
758 
slice_header(vid_dec_PrivateType * priv,struct vl_rbsp * rbsp,unsigned nal_unit_type)759 static void slice_header(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
760                          unsigned nal_unit_type)
761 {
762    struct pipe_h265_pps *pps;
763    struct pipe_h265_sps *sps;
764    bool first_slice_segment_in_pic_flag;
765    bool dependent_slice_segment_flag = false;
766    struct ref_pic_set *rps;
767    unsigned poc_lsb, poc_msb, slice_prev_poc;
768    unsigned max_poc_lsb, prev_poc_lsb, prev_poc_msb;
769    unsigned num_st_rps;
770    int i;
771 
772    if (priv->picture.h265.IDRPicFlag != is_idr_picture(nal_unit_type))
773       vid_dec_h265_EndFrame(priv);
774 
775    priv->picture.h265.IDRPicFlag = is_idr_picture(nal_unit_type);
776 
777    first_slice_segment_in_pic_flag = vl_rbsp_u(rbsp, 1);
778 
779    if (is_rap_picture(nal_unit_type))
780       /* no_output_of_prior_pics_flag */
781       vl_rbsp_u(rbsp, 1);
782 
783    pps = pic_parameter_set_id(priv, rbsp);
784    if (!pps)
785       return;
786 
787    sps = pps->sps;
788    if (!sps)
789       return;
790 
791    if (pps != priv->picture.h265.pps)
792       vid_dec_h265_EndFrame(priv);
793 
794    priv->picture.h265.pps = pps;
795 
796    if (priv->picture.h265.RAPPicFlag != is_rap_picture(nal_unit_type))
797       vid_dec_h265_EndFrame(priv);
798    priv->picture.h265.RAPPicFlag = is_rap_picture(nal_unit_type);
799 
800    num_st_rps = sps->num_short_term_ref_pic_sets;
801 
802    if (priv->picture.h265.CurrRpsIdx != num_st_rps)
803       vid_dec_h265_EndFrame(priv);
804    priv->picture.h265.CurrRpsIdx = num_st_rps;
805 
806    if (!first_slice_segment_in_pic_flag) {
807       int size, num;
808       int bits_slice_segment_address = 0;
809 
810       if (pps->dependent_slice_segments_enabled_flag)
811          dependent_slice_segment_flag = vl_rbsp_u(rbsp, 1);
812 
813       size = 1 << (sps->log2_min_luma_coding_block_size_minus3 + 3 +
814                    sps->log2_diff_max_min_luma_coding_block_size);
815 
816       num = ((sps->pic_width_in_luma_samples + size - 1) / size) *
817             ((sps->pic_height_in_luma_samples + size - 1) / size);
818 
819       while (num > (1 << bits_slice_segment_address))
820          bits_slice_segment_address++;
821 
822       /* slice_segment_address */
823       vl_rbsp_u(rbsp, bits_slice_segment_address);
824    }
825 
826    if (dependent_slice_segment_flag)
827       return;
828 
829    for (i = 0; i < pps->num_extra_slice_header_bits; ++i)
830       /* slice_reserved_flag */
831       vl_rbsp_u(rbsp, 1);
832 
833    /* slice_type */
834    vl_rbsp_ue(rbsp);
835 
836    if (pps->output_flag_present_flag)
837       /* pic output flag */
838       vl_rbsp_u(rbsp, 1);
839 
840    if (sps->separate_colour_plane_flag)
841       /* colour_plane_id */
842       vl_rbsp_u(rbsp, 2);
843 
844    if (is_idr_picture(nal_unit_type)) {
845       set_poc(priv, nal_unit_type, 0);
846       return;
847    }
848 
849    /* slice_pic_order_cnt_lsb */
850    poc_lsb =
851       vl_rbsp_u(rbsp, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
852 
853    slice_prev_poc = (int)priv->codec_data.h265.slice_prev_poc;
854    max_poc_lsb = 1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
855 
856    prev_poc_lsb = slice_prev_poc & (max_poc_lsb - 1);
857    prev_poc_msb = slice_prev_poc - prev_poc_lsb;
858 
859    if ((poc_lsb < prev_poc_lsb) &&
860        ((prev_poc_lsb - poc_lsb ) >= (max_poc_lsb / 2)))
861       poc_msb = prev_poc_msb + max_poc_lsb;
862 
863    else if ((poc_lsb > prev_poc_lsb ) &&
864             ((poc_lsb - prev_poc_lsb) > (max_poc_lsb / 2)))
865       poc_msb = prev_poc_msb - max_poc_lsb;
866 
867    else
868       poc_msb = prev_poc_msb;
869 
870    if (is_bla_picture(nal_unit_type))
871       poc_msb = 0;
872 
873    if (get_poc(priv) != poc_msb + poc_lsb)
874       vid_dec_h265_EndFrame(priv);
875 
876    set_poc(priv, nal_unit_type, (poc_msb + poc_lsb));
877 
878    /* short_term_ref_pic_set_sps_flag */
879    if (!vl_rbsp_u(rbsp, 1)) {
880       rps = (struct ref_pic_set *)
881          priv->codec_data.h265.ref_pic_set_list + num_st_rps;
882       st_ref_pic_set(priv, rbsp, rps, sps, num_st_rps);
883 
884    } else if (num_st_rps > 1) {
885       int num_bits = 0;
886       unsigned idx;
887 
888       while ((1 << num_bits) < num_st_rps)
889          num_bits++;
890 
891       if (num_bits > 0)
892          /* short_term_ref_pic_set_idx */
893          idx = vl_rbsp_u(rbsp, num_bits);
894       else
895          idx = 0;
896 
897       rps = (struct ref_pic_set *)
898          priv->codec_data.h265.ref_pic_set_list + idx;
899    } else
900       rps = (struct ref_pic_set *)
901          priv->codec_data.h265.ref_pic_set_list;
902 
903    if (is_bla_picture(nal_unit_type)) {
904       rps->num_neg_pics = 0;
905       rps->num_pos_pics = 0;
906       rps->num_pics = 0;
907    }
908 
909    priv->codec_data.h265.rps = rps;
910 
911    return;
912 }
913 
vid_dec_h265_Decode(vid_dec_PrivateType * priv,struct vl_vlc * vlc,unsigned min_bits_left)914 static void vid_dec_h265_Decode(vid_dec_PrivateType *priv,
915                                 struct vl_vlc *vlc,
916                                 unsigned min_bits_left)
917 {
918    unsigned nal_unit_type;
919    unsigned nuh_layer_id;
920    unsigned nuh_temporal_id_plus1;
921 
922    if (!vl_vlc_search_byte(vlc, vl_vlc_bits_left(vlc) - min_bits_left, 0x00))
923       return;
924 
925    if (vl_vlc_peekbits(vlc, 24) != 0x000001) {
926       vl_vlc_eatbits(vlc, 8);
927       return;
928    }
929 
930    if (priv->slice) {
931       unsigned bytes = priv->bytes_left - (vl_vlc_bits_left(vlc) / 8);
932 
933       priv->codec->decode_bitstream(priv->codec, priv->target,
934                                     &priv->picture.base, 1,
935                                     &priv->slice, &bytes);
936       priv->slice = NULL;
937    }
938 
939    vl_vlc_eatbits(vlc, 24);
940 
941    /* forbidden_zero_bit */
942    vl_vlc_eatbits(vlc, 1);
943 
944    if (vl_vlc_valid_bits(vlc) < 15)
945       vl_vlc_fillbits(vlc);
946 
947    nal_unit_type = vl_vlc_get_uimsbf(vlc, 6);
948 
949    /* nuh_layer_id */
950    nuh_layer_id = vl_vlc_get_uimsbf(vlc, 6);
951 
952    /* nuh_temporal_id_plus1 */
953    nuh_temporal_id_plus1 = vl_vlc_get_uimsbf(vlc, 3);
954    priv->codec_data.h265.temporal_id = nuh_temporal_id_plus1 - 1;
955 
956    if (!is_slice_picture(nal_unit_type))
957       vid_dec_h265_EndFrame(priv);
958 
959    if (nal_unit_type == NAL_UNIT_TYPE_SPS) {
960       struct vl_rbsp rbsp;
961 
962       vl_rbsp_init(&rbsp, vlc, ~0);
963       seq_parameter_set(priv, &rbsp);
964 
965    } else if (nal_unit_type == NAL_UNIT_TYPE_PPS) {
966       struct vl_rbsp rbsp;
967 
968       vl_rbsp_init(&rbsp, vlc, ~0);
969       picture_parameter_set(priv, &rbsp);
970 
971    } else if (is_slice_picture(nal_unit_type)) {
972       unsigned bits = vl_vlc_valid_bits(vlc);
973       unsigned bytes = bits / 8 + 5;
974       struct vl_rbsp rbsp;
975       uint8_t buf[9];
976       const void *ptr = buf;
977       unsigned i;
978 
979       buf[0] = 0x0;
980       buf[1] = 0x0;
981       buf[2] = 0x1;
982       buf[3] = nal_unit_type << 1 | nuh_layer_id >> 5;
983       buf[4] = nuh_layer_id << 3 | nuh_temporal_id_plus1;
984       for (i = 5; i < bytes; ++i)
985          buf[i] = vl_vlc_peekbits(vlc, bits) >> ((bytes - i - 1) * 8);
986 
987       priv->bytes_left = (vl_vlc_bits_left(vlc) - bits) / 8;
988       priv->slice = vlc->data;
989 
990       vl_rbsp_init(&rbsp, vlc, 128);
991       slice_header(priv, &rbsp, nal_unit_type);
992 
993       vid_dec_h265_BeginFrame(priv);
994 
995       priv->codec->decode_bitstream(priv->codec, priv->target,
996                                     &priv->picture.base, 1,
997                                     &ptr, &bytes);
998    }
999 
1000    /* resync to byte boundary */
1001    vl_vlc_eatbits(vlc, vl_vlc_valid_bits(vlc) % 8);
1002 }
1003 
vid_dec_h265_Init(vid_dec_PrivateType * priv)1004 void vid_dec_h265_Init(vid_dec_PrivateType *priv)
1005 {
1006    priv->picture.base.profile = PIPE_VIDEO_PROFILE_HEVC_MAIN;
1007 
1008    list_inithead(&priv->codec_data.h265.dpb_list);
1009    priv->codec_data.h265.ref_pic_set_list = (struct ref_pic_set *)
1010       CALLOC(MAX_NUM_REF_PICS, sizeof(struct ref_pic_set));
1011 
1012    priv->Decode = vid_dec_h265_Decode;
1013    priv->EndFrame = vid_dec_h265_EndFrame;
1014    priv->Flush = vid_dec_h265_Flush;
1015    priv->first_buf_in_frame = true;
1016 }
1017