Home | History | Annotate | Download | only in omx
      1 /**************************************************************************
      2  *
      3  * Copyright 2013 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 /*
     29  * Authors:
     30  *      Christian Knig <christian.koenig (at) amd.com>
     31  *
     32  */
     33 
     34 #include "pipe/p_video_codec.h"
     35 #include "util/u_memory.h"
     36 #include "util/u_video.h"
     37 #include "vl/vl_rbsp.h"
     38 #include "vl/vl_zscan.h"
     39 
     40 #include "entrypoint.h"
     41 #include "vid_dec.h"
     42 
     43 #define DPB_MAX_SIZE 5
     44 
     45 struct dpb_list {
     46    struct list_head list;
     47    struct pipe_video_buffer *buffer;
     48    OMX_TICKS timestamp;
     49    int poc;
     50 };
     51 
     52 static const uint8_t Default_4x4_Intra[16] = {
     53     6, 13, 20, 28, 13, 20, 28, 32,
     54    20, 28, 32, 37, 28, 32, 37, 42
     55 };
     56 
     57 static const uint8_t Default_4x4_Inter[16] = {
     58    10, 14, 20, 24, 14, 20, 24, 27,
     59    20, 24, 27, 30, 24, 27, 30, 34
     60 };
     61 
     62 static const uint8_t Default_8x8_Intra[64] = {
     63     6, 10, 13, 16, 18, 23, 25, 27,
     64    10, 11, 16, 18, 23, 25, 27, 29,
     65    13, 16, 18, 23, 25, 27, 29, 31,
     66    16, 18, 23, 25, 27, 29, 31, 33,
     67    18, 23, 25, 27, 29, 31, 33, 36,
     68    23, 25, 27, 29, 31, 33, 36, 38,
     69    25, 27, 29, 31, 33, 36, 38, 40,
     70    27, 29, 31, 33, 36, 38, 40, 42
     71 };
     72 
     73 static const uint8_t Default_8x8_Inter[64] = {
     74     9, 13, 15, 17, 19, 21, 22, 24,
     75    13, 13, 17, 19, 21, 22, 24, 25,
     76    15, 17, 19, 21, 22, 24, 25, 27,
     77    17, 19, 21, 22, 24, 25, 27, 28,
     78    19, 21, 22, 24, 25, 27, 28, 30,
     79    21, 22, 24, 25, 27, 28, 30, 32,
     80    22, 24, 25, 27, 28, 30, 32, 33,
     81    24, 25, 27, 28, 30, 32, 33, 35
     82 };
     83 
     84 static void vid_dec_h264_Decode(vid_dec_PrivateType *priv, struct vl_vlc *vlc, unsigned min_bits_left);
     85 static void vid_dec_h264_EndFrame(vid_dec_PrivateType *priv);
     86 static struct pipe_video_buffer *vid_dec_h264_Flush(vid_dec_PrivateType *priv, OMX_TICKS *timestamp);
     87 
     88 void vid_dec_h264_Init(vid_dec_PrivateType *priv)
     89 {
     90    priv->picture.base.profile = PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
     91 
     92    priv->Decode = vid_dec_h264_Decode;
     93    priv->EndFrame = vid_dec_h264_EndFrame;
     94    priv->Flush = vid_dec_h264_Flush;
     95 
     96    LIST_INITHEAD(&priv->codec_data.h264.dpb_list);
     97    priv->picture.h264.field_order_cnt[0] = priv->picture.h264.field_order_cnt[1] = INT_MAX;
     98    priv->first_buf_in_frame = true;
     99 }
    100 
    101 static void vid_dec_h264_BeginFrame(vid_dec_PrivateType *priv)
    102 {
    103    //TODO: sane buffer handling
    104 
    105    if (priv->frame_started)
    106       return;
    107 
    108    if (!priv->codec) {
    109       struct pipe_video_codec templat = {};
    110       omx_base_video_PortType *port;
    111 
    112       port = (omx_base_video_PortType *)priv->ports[OMX_BASE_FILTER_INPUTPORT_INDEX];
    113       templat.profile = priv->profile;
    114       templat.entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM;
    115       templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
    116       templat.max_references = priv->picture.h264.num_ref_frames;
    117       templat.expect_chunked_decode = true;
    118       templat.width = port->sPortParam.format.video.nFrameWidth;
    119       templat.height = port->sPortParam.format.video.nFrameHeight;
    120       templat.level = priv->picture.h264.pps->sps->level_idc;
    121 
    122       priv->codec = priv->pipe->create_video_codec(priv->pipe, &templat);
    123    }
    124 
    125    vid_dec_NeedTarget(priv);
    126 
    127    if (priv->first_buf_in_frame)
    128       priv->timestamp = priv->timestamps[0];
    129    priv->first_buf_in_frame = false;
    130 
    131    priv->picture.h264.num_ref_frames = priv->picture.h264.pps->sps->max_num_ref_frames;
    132 
    133    priv->picture.h264.slice_count = 0;
    134    priv->codec->begin_frame(priv->codec, priv->target, &priv->picture.base);
    135    priv->frame_started = true;
    136 }
    137 
    138 static struct pipe_video_buffer *vid_dec_h264_Flush(vid_dec_PrivateType *priv,
    139                                                     OMX_TICKS *timestamp)
    140 {
    141    struct dpb_list *entry, *result = NULL;
    142    struct pipe_video_buffer *buf;
    143 
    144    /* search for the lowest poc and break on zeros */
    145    LIST_FOR_EACH_ENTRY(entry, &priv->codec_data.h264.dpb_list, list) {
    146 
    147       if (result && entry->poc == 0)
    148          break;
    149 
    150       if (!result || entry->poc < result->poc)
    151          result = entry;
    152    }
    153 
    154    if (!result)
    155       return NULL;
    156 
    157    buf = result->buffer;
    158    if (timestamp)
    159       *timestamp = result->timestamp;
    160 
    161    --priv->codec_data.h264.dpb_num;
    162    LIST_DEL(&result->list);
    163    FREE(result);
    164 
    165    return buf;
    166 }
    167 
    168 static void vid_dec_h264_EndFrame(vid_dec_PrivateType *priv)
    169 {
    170    struct dpb_list *entry;
    171    struct pipe_video_buffer *tmp;
    172    bool top_field_first;
    173    OMX_TICKS timestamp;
    174 
    175    if (!priv->frame_started)
    176       return;
    177 
    178    priv->codec->end_frame(priv->codec, priv->target, &priv->picture.base);
    179    priv->frame_started = false;
    180 
    181    // TODO: implement frame number handling
    182    priv->picture.h264.frame_num_list[0] = priv->picture.h264.frame_num;
    183    priv->picture.h264.field_order_cnt_list[0][0] = priv->picture.h264.frame_num;
    184    priv->picture.h264.field_order_cnt_list[0][1] = priv->picture.h264.frame_num;
    185 
    186    top_field_first = priv->picture.h264.field_order_cnt[0] <  priv->picture.h264.field_order_cnt[1];
    187 
    188    if (priv->picture.h264.field_pic_flag && priv->picture.h264.bottom_field_flag != top_field_first)
    189       return;
    190 
    191    /* add the decoded picture to the dpb list */
    192    entry = CALLOC_STRUCT(dpb_list);
    193    if (!entry)
    194       return;
    195 
    196    priv->first_buf_in_frame = true;
    197    entry->buffer = priv->target;
    198    entry->timestamp = priv->timestamp;
    199    entry->poc = MIN2(priv->picture.h264.field_order_cnt[0], priv->picture.h264.field_order_cnt[1]);
    200    LIST_ADDTAIL(&entry->list, &priv->codec_data.h264.dpb_list);
    201    ++priv->codec_data.h264.dpb_num;
    202    priv->target = NULL;
    203    priv->picture.h264.field_order_cnt[0] = priv->picture.h264.field_order_cnt[1] = INT_MAX;
    204 
    205    if (priv->codec_data.h264.dpb_num <= DPB_MAX_SIZE)
    206       return;
    207 
    208    tmp = priv->in_buffers[0]->pInputPortPrivate;
    209    priv->in_buffers[0]->pInputPortPrivate = vid_dec_h264_Flush(priv, &timestamp);
    210    priv->in_buffers[0]->nTimeStamp = timestamp;
    211    priv->target = tmp;
    212    priv->frame_finished = priv->in_buffers[0]->pInputPortPrivate != NULL;
    213 }
    214 
    215 static void vui_parameters(struct vl_rbsp *rbsp)
    216 {
    217    // TODO
    218 }
    219 
    220 static void scaling_list(struct vl_rbsp *rbsp, uint8_t *scalingList, unsigned sizeOfScalingList,
    221                          const uint8_t *defaultList, const uint8_t *fallbackList)
    222 {
    223    unsigned lastScale = 8, nextScale = 8;
    224    const int *list;
    225    unsigned i;
    226 
    227    /* (pic|seq)_scaling_list_present_flag[i] */
    228    if (!vl_rbsp_u(rbsp, 1)) {
    229       if (fallbackList)
    230          memcpy(scalingList, fallbackList, sizeOfScalingList);
    231       return;
    232    }
    233 
    234    list = (sizeOfScalingList == 16) ? vl_zscan_normal_16 : vl_zscan_normal;
    235    for (i = 0; i < sizeOfScalingList; ++i ) {
    236 
    237       if (nextScale != 0) {
    238          signed delta_scale = vl_rbsp_se(rbsp);
    239          nextScale = (lastScale + delta_scale + 256) % 256;
    240          if (i == 0 && nextScale == 0) {
    241             memcpy(scalingList, defaultList, sizeOfScalingList);
    242             return;
    243          }
    244       }
    245       scalingList[list[i]] = nextScale == 0 ? lastScale : nextScale;
    246       lastScale = scalingList[list[i]];
    247    }
    248 }
    249 
    250 static struct pipe_h264_sps *seq_parameter_set_id(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
    251 {
    252    unsigned id = vl_rbsp_ue(rbsp);
    253    if (id >= ARRAY_SIZE(priv->codec_data.h264.sps))
    254       return NULL; /* invalid seq_parameter_set_id */
    255 
    256    return &priv->codec_data.h264.sps[id];
    257 }
    258 
    259 static void seq_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
    260 {
    261    struct pipe_h264_sps *sps;
    262    unsigned profile_idc, level_idc;
    263    unsigned i;
    264 
    265    /* Sequence parameter set */
    266    profile_idc = vl_rbsp_u(rbsp, 8);
    267 
    268    /* constraint_set0_flag */
    269    vl_rbsp_u(rbsp, 1);
    270 
    271    /* constraint_set1_flag */
    272    vl_rbsp_u(rbsp, 1);
    273 
    274    /* constraint_set2_flag */
    275    vl_rbsp_u(rbsp, 1);
    276 
    277    /* constraint_set3_flag */
    278    vl_rbsp_u(rbsp, 1);
    279 
    280    /* constraint_set4_flag */
    281    vl_rbsp_u(rbsp, 1);
    282 
    283    /* constraint_set5_flag */
    284    vl_rbsp_u(rbsp, 1);
    285 
    286    /* reserved_zero_2bits */
    287    vl_rbsp_u(rbsp, 2);
    288 
    289    /* level_idc */
    290    level_idc = vl_rbsp_u(rbsp, 8);
    291 
    292    sps = seq_parameter_set_id(priv, rbsp);
    293    if (!sps)
    294       return;
    295 
    296    memset(sps, 0, sizeof(*sps));
    297    memset(sps->ScalingList4x4, 16, sizeof(sps->ScalingList4x4));
    298    memset(sps->ScalingList8x8, 16, sizeof(sps->ScalingList8x8));
    299 
    300    sps->level_idc = level_idc;
    301 
    302    if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 || profile_idc == 244 ||
    303        profile_idc == 44 || profile_idc == 83 || profile_idc == 86 || profile_idc == 118 ||
    304        profile_idc == 128 || profile_idc == 138) {
    305 
    306       sps->chroma_format_idc = vl_rbsp_ue(rbsp);
    307 
    308       if (sps->chroma_format_idc == 3)
    309          sps->separate_colour_plane_flag = vl_rbsp_u(rbsp, 1);
    310 
    311       sps->bit_depth_luma_minus8 = vl_rbsp_ue(rbsp);
    312 
    313       sps->bit_depth_chroma_minus8 = vl_rbsp_ue(rbsp);
    314 
    315       /* qpprime_y_zero_transform_bypass_flag */
    316       vl_rbsp_u(rbsp, 1);
    317 
    318       sps->seq_scaling_matrix_present_flag = vl_rbsp_u(rbsp, 1);
    319       if (sps->seq_scaling_matrix_present_flag) {
    320 
    321          scaling_list(rbsp, sps->ScalingList4x4[0], 16, Default_4x4_Intra, Default_4x4_Intra);
    322          scaling_list(rbsp, sps->ScalingList4x4[1], 16, Default_4x4_Intra, sps->ScalingList4x4[0]);
    323          scaling_list(rbsp, sps->ScalingList4x4[2], 16, Default_4x4_Intra, sps->ScalingList4x4[1]);
    324          scaling_list(rbsp, sps->ScalingList4x4[3], 16, Default_4x4_Inter, Default_4x4_Inter);
    325          scaling_list(rbsp, sps->ScalingList4x4[4], 16, Default_4x4_Inter, sps->ScalingList4x4[3]);
    326          scaling_list(rbsp, sps->ScalingList4x4[5], 16, Default_4x4_Inter, sps->ScalingList4x4[4]);
    327 
    328          scaling_list(rbsp, sps->ScalingList8x8[0], 64, Default_8x8_Intra, Default_8x8_Intra);
    329          scaling_list(rbsp, sps->ScalingList8x8[1], 64, Default_8x8_Inter, Default_8x8_Inter);
    330          if (sps->chroma_format_idc == 3) {
    331             scaling_list(rbsp, sps->ScalingList8x8[2], 64, Default_8x8_Intra, sps->ScalingList8x8[0]);
    332             scaling_list(rbsp, sps->ScalingList8x8[3], 64, Default_8x8_Inter, sps->ScalingList8x8[1]);
    333             scaling_list(rbsp, sps->ScalingList8x8[4], 64, Default_8x8_Intra, sps->ScalingList8x8[2]);
    334             scaling_list(rbsp, sps->ScalingList8x8[5], 64, Default_8x8_Inter, sps->ScalingList8x8[3]);
    335          }
    336       }
    337    } else if (profile_idc == 183)
    338       sps->chroma_format_idc = 0;
    339    else
    340       sps->chroma_format_idc = 1;
    341 
    342    sps->log2_max_frame_num_minus4 = vl_rbsp_ue(rbsp);
    343 
    344    sps->pic_order_cnt_type = vl_rbsp_ue(rbsp);
    345 
    346    if (sps->pic_order_cnt_type == 0)
    347       sps->log2_max_pic_order_cnt_lsb_minus4 = vl_rbsp_ue(rbsp);
    348    else if (sps->pic_order_cnt_type == 1) {
    349       sps->delta_pic_order_always_zero_flag = vl_rbsp_u(rbsp, 1);
    350 
    351       sps->offset_for_non_ref_pic = vl_rbsp_se(rbsp);
    352 
    353       sps->offset_for_top_to_bottom_field = vl_rbsp_se(rbsp);
    354 
    355       sps->num_ref_frames_in_pic_order_cnt_cycle = vl_rbsp_ue(rbsp);
    356 
    357       for (i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; ++i)
    358          sps->offset_for_ref_frame[i] = vl_rbsp_se(rbsp);
    359    }
    360 
    361    sps->max_num_ref_frames = vl_rbsp_ue(rbsp);
    362 
    363    /* gaps_in_frame_num_value_allowed_flag */
    364    vl_rbsp_u(rbsp, 1);
    365 
    366    /* pic_width_in_mbs_minus1 */
    367    vl_rbsp_ue(rbsp);
    368 
    369    /* pic_height_in_map_units_minus1 */
    370    vl_rbsp_ue(rbsp);
    371 
    372    sps->frame_mbs_only_flag = vl_rbsp_u(rbsp, 1);
    373    if (!sps->frame_mbs_only_flag)
    374       sps->mb_adaptive_frame_field_flag = vl_rbsp_u(rbsp, 1);
    375 
    376    sps->direct_8x8_inference_flag = vl_rbsp_u(rbsp, 1);
    377 
    378    /* frame_cropping_flag */
    379    if (vl_rbsp_u(rbsp, 1)) {
    380       /* frame_crop_left_offset */
    381       vl_rbsp_ue(rbsp);
    382 
    383       /* frame_crop_right_offset */
    384       vl_rbsp_ue(rbsp);
    385 
    386       /* frame_crop_top_offset */
    387       vl_rbsp_ue(rbsp);
    388 
    389       /* frame_crop_bottom_offset */
    390       vl_rbsp_ue(rbsp);
    391    }
    392 
    393    /* vui_parameters_present_flag */
    394    if (vl_rbsp_u(rbsp, 1))
    395       vui_parameters(rbsp);
    396 }
    397 
    398 static struct pipe_h264_pps *pic_parameter_set_id(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
    399 {
    400    unsigned id = vl_rbsp_ue(rbsp);
    401    if (id >= ARRAY_SIZE(priv->codec_data.h264.pps))
    402       return NULL; /* invalid pic_parameter_set_id */
    403 
    404    return &priv->codec_data.h264.pps[id];
    405 }
    406 
    407 static void picture_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
    408 {
    409    struct pipe_h264_sps *sps;
    410    struct pipe_h264_pps *pps;
    411    unsigned i;
    412 
    413    pps = pic_parameter_set_id(priv, rbsp);
    414    if (!pps)
    415       return;
    416 
    417    memset(pps, 0, sizeof(*pps));
    418 
    419    sps = pps->sps = seq_parameter_set_id(priv, rbsp);
    420    if (!sps)
    421       return;
    422 
    423    memcpy(pps->ScalingList4x4, sps->ScalingList4x4, sizeof(pps->ScalingList4x4));
    424    memcpy(pps->ScalingList8x8, sps->ScalingList8x8, sizeof(pps->ScalingList8x8));
    425 
    426    pps->entropy_coding_mode_flag = vl_rbsp_u(rbsp, 1);
    427 
    428    pps->bottom_field_pic_order_in_frame_present_flag = vl_rbsp_u(rbsp, 1);
    429 
    430    pps->num_slice_groups_minus1 = vl_rbsp_ue(rbsp);
    431    if (pps->num_slice_groups_minus1 > 0) {
    432       pps->slice_group_map_type = vl_rbsp_ue(rbsp);
    433 
    434       if (pps->slice_group_map_type == 0) {
    435 
    436          for (i = 0; i <= pps->num_slice_groups_minus1; ++i)
    437             /* run_length_minus1[i] */
    438             vl_rbsp_ue(rbsp);
    439 
    440       } else if (pps->slice_group_map_type == 2) {
    441 
    442          for (i = 0; i <= pps->num_slice_groups_minus1; ++i) {
    443             /* top_left[i] */
    444             vl_rbsp_ue(rbsp);
    445 
    446             /* bottom_right[i] */
    447             vl_rbsp_ue(rbsp);
    448          }
    449 
    450       } else if (pps->slice_group_map_type >= 3 && pps->slice_group_map_type <= 5) {
    451 
    452          /* slice_group_change_direction_flag */
    453          vl_rbsp_u(rbsp, 1);
    454 
    455          pps->slice_group_change_rate_minus1 = vl_rbsp_ue(rbsp);
    456 
    457       } else if (pps->slice_group_map_type == 6) {
    458 
    459          unsigned pic_size_in_map_units_minus1;
    460 
    461          pic_size_in_map_units_minus1 = vl_rbsp_ue(rbsp);
    462 
    463          for (i = 0; i <= pic_size_in_map_units_minus1; ++i)
    464             /* slice_group_id[i] */
    465             vl_rbsp_u(rbsp, log2(pps->num_slice_groups_minus1 + 1));
    466       }
    467    }
    468 
    469    pps->num_ref_idx_l0_default_active_minus1 = vl_rbsp_ue(rbsp);
    470 
    471    pps->num_ref_idx_l1_default_active_minus1 = vl_rbsp_ue(rbsp);
    472 
    473    pps->weighted_pred_flag = vl_rbsp_u(rbsp, 1);
    474 
    475    pps->weighted_bipred_idc = vl_rbsp_u(rbsp, 2);
    476 
    477    pps->pic_init_qp_minus26 = vl_rbsp_se(rbsp);
    478 
    479    /* pic_init_qs_minus26 */
    480    vl_rbsp_se(rbsp);
    481 
    482    pps->chroma_qp_index_offset = vl_rbsp_se(rbsp);
    483 
    484    pps->deblocking_filter_control_present_flag = vl_rbsp_u(rbsp, 1);
    485 
    486    pps->constrained_intra_pred_flag = vl_rbsp_u(rbsp, 1);
    487 
    488    pps->redundant_pic_cnt_present_flag = vl_rbsp_u(rbsp, 1);
    489 
    490    if (vl_rbsp_more_data(rbsp)) {
    491       pps->transform_8x8_mode_flag = vl_rbsp_u(rbsp, 1);
    492 
    493       /* pic_scaling_matrix_present_flag */
    494       if (vl_rbsp_u(rbsp, 1)) {
    495 
    496          scaling_list(rbsp, pps->ScalingList4x4[0], 16, Default_4x4_Intra,
    497                       sps->seq_scaling_matrix_present_flag ? NULL : Default_4x4_Intra);
    498          scaling_list(rbsp, pps->ScalingList4x4[1], 16, Default_4x4_Intra, pps->ScalingList4x4[0]);
    499          scaling_list(rbsp, pps->ScalingList4x4[2], 16, Default_4x4_Intra, pps->ScalingList4x4[1]);
    500          scaling_list(rbsp, pps->ScalingList4x4[3], 16, Default_4x4_Inter,
    501                       sps->seq_scaling_matrix_present_flag ? NULL : Default_4x4_Inter);
    502          scaling_list(rbsp, pps->ScalingList4x4[4], 16, Default_4x4_Inter, pps->ScalingList4x4[3]);
    503          scaling_list(rbsp, pps->ScalingList4x4[5], 16, Default_4x4_Inter, pps->ScalingList4x4[4]);
    504 
    505          if (pps->transform_8x8_mode_flag) {
    506             scaling_list(rbsp, pps->ScalingList8x8[0], 64, Default_8x8_Intra,
    507                          sps->seq_scaling_matrix_present_flag ? NULL : Default_8x8_Intra);
    508             scaling_list(rbsp, pps->ScalingList8x8[1], 64, Default_8x8_Inter,
    509                          sps->seq_scaling_matrix_present_flag ? NULL :  Default_8x8_Inter);
    510             if (sps->chroma_format_idc == 3) {
    511                scaling_list(rbsp, pps->ScalingList8x8[2], 64, Default_8x8_Intra, pps->ScalingList8x8[0]);
    512                scaling_list(rbsp, pps->ScalingList8x8[3], 64, Default_8x8_Inter, pps->ScalingList8x8[1]);
    513                scaling_list(rbsp, pps->ScalingList8x8[4], 64, Default_8x8_Intra, pps->ScalingList8x8[2]);
    514                scaling_list(rbsp, pps->ScalingList8x8[5], 64, Default_8x8_Inter, pps->ScalingList8x8[3]);
    515             }
    516          }
    517       }
    518 
    519       pps->second_chroma_qp_index_offset = vl_rbsp_se(rbsp);
    520    }
    521 }
    522 
    523 static void ref_pic_list_mvc_modification(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
    524 {
    525    // TODO
    526    assert(0);
    527 }
    528 
    529 static void ref_pic_list_modification(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
    530                                       enum pipe_h264_slice_type slice_type)
    531 {
    532    unsigned modification_of_pic_nums_idc;
    533 
    534    if (slice_type != 2 && slice_type != 4) {
    535       /* ref_pic_list_modification_flag_l0 */
    536       if (vl_rbsp_u(rbsp, 1)) {
    537          do {
    538             modification_of_pic_nums_idc = vl_rbsp_ue(rbsp);
    539             if (modification_of_pic_nums_idc == 0 ||
    540                 modification_of_pic_nums_idc == 1)
    541                /* abs_diff_pic_num_minus1 */
    542                vl_rbsp_ue(rbsp);
    543             else if (modification_of_pic_nums_idc == 2)
    544                /* long_term_pic_num */
    545                vl_rbsp_ue(rbsp);
    546          } while (modification_of_pic_nums_idc != 3);
    547       }
    548    }
    549 
    550    if (slice_type == 1) {
    551       /* ref_pic_list_modification_flag_l1 */
    552       if (vl_rbsp_u(rbsp, 1)) {
    553          do {
    554             modification_of_pic_nums_idc = vl_rbsp_ue(rbsp);
    555             if (modification_of_pic_nums_idc == 0 ||
    556                 modification_of_pic_nums_idc == 1)
    557                /* abs_diff_pic_num_minus1 */
    558                vl_rbsp_ue(rbsp);
    559             else if (modification_of_pic_nums_idc == 2)
    560                /* long_term_pic_num */
    561                vl_rbsp_ue(rbsp);
    562          } while (modification_of_pic_nums_idc != 3);
    563       }
    564    }
    565 }
    566 
    567 static void pred_weight_table(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
    568                               struct pipe_h264_sps *sps, enum pipe_h264_slice_type slice_type)
    569 {
    570    unsigned ChromaArrayType = sps->separate_colour_plane_flag ? 0 : sps->chroma_format_idc;
    571    unsigned i, j;
    572 
    573    /* luma_log2_weight_denom */
    574    vl_rbsp_ue(rbsp);
    575 
    576    if (ChromaArrayType != 0)
    577       /* chroma_log2_weight_denom */
    578       vl_rbsp_ue(rbsp);
    579 
    580    for (i = 0; i <= priv->picture.h264.num_ref_idx_l0_active_minus1; ++i) {
    581       /* luma_weight_l0_flag */
    582       if (vl_rbsp_u(rbsp, 1)) {
    583          /* luma_weight_l0[i] */
    584          vl_rbsp_se(rbsp);
    585          /* luma_offset_l0[i] */
    586          vl_rbsp_se(rbsp);
    587       }
    588       if (ChromaArrayType != 0) {
    589          /* chroma_weight_l0_flag */
    590          if (vl_rbsp_u(rbsp, 1)) {
    591             for (j = 0; j < 2; ++j) {
    592                /* chroma_weight_l0[i][j] */
    593                vl_rbsp_se(rbsp);
    594                /* chroma_offset_l0[i][j] */
    595                vl_rbsp_se(rbsp);
    596             }
    597          }
    598       }
    599    }
    600 
    601    if (slice_type == 1) {
    602       for (i = 0; i <= priv->picture.h264.num_ref_idx_l1_active_minus1; ++i) {
    603          /* luma_weight_l1_flag */
    604          if (vl_rbsp_u(rbsp, 1)) {
    605             /* luma_weight_l1[i] */
    606             vl_rbsp_se(rbsp);
    607             /* luma_offset_l1[i] */
    608             vl_rbsp_se(rbsp);
    609          }
    610          if (ChromaArrayType != 0) {
    611             /* chroma_weight_l1_flag */
    612             if (vl_rbsp_u(rbsp, 1)) {
    613                for (j = 0; j < 2; ++j) {
    614                   /* chroma_weight_l1[i][j] */
    615                   vl_rbsp_se(rbsp);
    616                   /* chroma_offset_l1[i][j] */
    617                   vl_rbsp_se(rbsp);
    618                }
    619             }
    620          }
    621       }
    622    }
    623 }
    624 
    625 static void dec_ref_pic_marking(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
    626                                 bool IdrPicFlag)
    627 {
    628    unsigned memory_management_control_operation;
    629 
    630    if (IdrPicFlag) {
    631       /* no_output_of_prior_pics_flag */
    632       vl_rbsp_u(rbsp, 1);
    633       /* long_term_reference_flag */
    634       vl_rbsp_u(rbsp, 1);
    635    } else {
    636       /* adaptive_ref_pic_marking_mode_flag */
    637       if (vl_rbsp_u(rbsp, 1)) {
    638          do {
    639             memory_management_control_operation = vl_rbsp_ue(rbsp);
    640 
    641             if (memory_management_control_operation == 1 ||
    642                 memory_management_control_operation == 3)
    643                /* difference_of_pic_nums_minus1 */
    644                vl_rbsp_ue(rbsp);
    645 
    646             if (memory_management_control_operation == 2)
    647                /* long_term_pic_num */
    648                vl_rbsp_ue(rbsp);
    649 
    650             if (memory_management_control_operation == 3 ||
    651                 memory_management_control_operation == 6)
    652                /* long_term_frame_idx */
    653                vl_rbsp_ue(rbsp);
    654 
    655             if (memory_management_control_operation == 4)
    656                /* max_long_term_frame_idx_plus1 */
    657                vl_rbsp_ue(rbsp);
    658          } while (memory_management_control_operation != 0);
    659       }
    660    }
    661 }
    662 
    663 static void slice_header(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
    664                          unsigned nal_ref_idc, unsigned nal_unit_type)
    665 {
    666    enum pipe_h264_slice_type slice_type;
    667    struct pipe_h264_pps *pps;
    668    struct pipe_h264_sps *sps;
    669    unsigned frame_num, prevFrameNum;
    670    bool IdrPicFlag = nal_unit_type == 5;
    671 
    672    if (IdrPicFlag != priv->codec_data.h264.IdrPicFlag)
    673       vid_dec_h264_EndFrame(priv);
    674 
    675    priv->codec_data.h264.IdrPicFlag = IdrPicFlag;
    676 
    677    /* first_mb_in_slice */
    678    vl_rbsp_ue(rbsp);
    679 
    680    slice_type = vl_rbsp_ue(rbsp) % 5;
    681 
    682    pps = pic_parameter_set_id(priv, rbsp);
    683    if (!pps)
    684       return;
    685 
    686    sps = pps->sps;
    687    if (!sps)
    688       return;
    689 
    690    if (pps != priv->picture.h264.pps)
    691       vid_dec_h264_EndFrame(priv);
    692 
    693    priv->picture.h264.pps = pps;
    694 
    695    if (sps->separate_colour_plane_flag == 1 )
    696       /* colour_plane_id */
    697       vl_rbsp_u(rbsp, 2);
    698 
    699    frame_num = vl_rbsp_u(rbsp, sps->log2_max_frame_num_minus4 + 4);
    700 
    701    if (frame_num != priv->picture.h264.frame_num)
    702       vid_dec_h264_EndFrame(priv);
    703 
    704    prevFrameNum = priv->picture.h264.frame_num;
    705    priv->picture.h264.frame_num = frame_num;
    706 
    707    priv->picture.h264.field_pic_flag = 0;
    708    priv->picture.h264.bottom_field_flag = 0;
    709 
    710    if (!sps->frame_mbs_only_flag) {
    711       unsigned field_pic_flag = vl_rbsp_u(rbsp, 1);
    712 
    713       if (!field_pic_flag && field_pic_flag != priv->picture.h264.field_pic_flag)
    714          vid_dec_h264_EndFrame(priv);
    715 
    716       priv->picture.h264.field_pic_flag = field_pic_flag;
    717 
    718       if (priv->picture.h264.field_pic_flag) {
    719          unsigned bottom_field_flag = vl_rbsp_u(rbsp, 1);
    720 
    721          if (bottom_field_flag != priv->picture.h264.bottom_field_flag)
    722             vid_dec_h264_EndFrame(priv);
    723 
    724          priv->picture.h264.bottom_field_flag = bottom_field_flag;
    725       }
    726    }
    727 
    728    if (IdrPicFlag) {
    729       unsigned idr_pic_id = vl_rbsp_ue(rbsp);
    730 
    731       if (idr_pic_id != priv->codec_data.h264.idr_pic_id)
    732          vid_dec_h264_EndFrame(priv);
    733 
    734       priv->codec_data.h264.idr_pic_id = idr_pic_id;
    735    }
    736 
    737    if (sps->pic_order_cnt_type == 0) {
    738       unsigned log2_max_pic_order_cnt_lsb = sps->log2_max_pic_order_cnt_lsb_minus4 + 4;
    739       unsigned max_pic_order_cnt_lsb = 1 << log2_max_pic_order_cnt_lsb;
    740       int pic_order_cnt_lsb = vl_rbsp_u(rbsp, log2_max_pic_order_cnt_lsb);
    741       int pic_order_cnt_msb;
    742 
    743       if (pic_order_cnt_lsb != priv->codec_data.h264.pic_order_cnt_lsb)
    744          vid_dec_h264_EndFrame(priv);
    745 
    746       if (IdrPicFlag) {
    747          priv->codec_data.h264.pic_order_cnt_msb = 0;
    748          priv->codec_data.h264.pic_order_cnt_lsb = 0;
    749       }
    750 
    751       if ((pic_order_cnt_lsb < priv->codec_data.h264.pic_order_cnt_lsb) &&
    752           (priv->codec_data.h264.pic_order_cnt_lsb - pic_order_cnt_lsb) >= (max_pic_order_cnt_lsb / 2))
    753          pic_order_cnt_msb = priv->codec_data.h264.pic_order_cnt_msb + max_pic_order_cnt_lsb;
    754 
    755       else if ((pic_order_cnt_lsb > priv->codec_data.h264.pic_order_cnt_lsb) &&
    756           (pic_order_cnt_lsb - priv->codec_data.h264.pic_order_cnt_lsb) > (max_pic_order_cnt_lsb / 2))
    757          pic_order_cnt_msb = priv->codec_data.h264.pic_order_cnt_msb - max_pic_order_cnt_lsb;
    758 
    759       else
    760          pic_order_cnt_msb = priv->codec_data.h264.pic_order_cnt_msb;
    761 
    762       priv->codec_data.h264.pic_order_cnt_msb = pic_order_cnt_msb;
    763       priv->codec_data.h264.pic_order_cnt_lsb = pic_order_cnt_lsb;
    764 
    765       if (pps->bottom_field_pic_order_in_frame_present_flag && !priv->picture.h264.field_pic_flag) {
    766          unsigned delta_pic_order_cnt_bottom = vl_rbsp_se(rbsp);
    767 
    768          if (delta_pic_order_cnt_bottom != priv->codec_data.h264.delta_pic_order_cnt_bottom)
    769             vid_dec_h264_EndFrame(priv);
    770 
    771          priv->codec_data.h264.delta_pic_order_cnt_bottom = delta_pic_order_cnt_bottom;
    772       }
    773 
    774       if (!priv->picture.h264.field_pic_flag) {
    775          priv->picture.h264.field_order_cnt[0] = pic_order_cnt_msb + pic_order_cnt_lsb;
    776          priv->picture.h264.field_order_cnt[1] = priv->picture.h264.field_order_cnt [0] +
    777                                           priv->codec_data.h264.delta_pic_order_cnt_bottom;
    778       } else if (!priv->picture.h264.bottom_field_flag)
    779          priv->picture.h264.field_order_cnt[0] = pic_order_cnt_msb + pic_order_cnt_lsb;
    780       else
    781          priv->picture.h264.field_order_cnt[1] = pic_order_cnt_msb + pic_order_cnt_lsb;
    782 
    783    } else if (sps->pic_order_cnt_type == 1) {
    784       unsigned MaxFrameNum = 1 << (sps->log2_max_frame_num_minus4 + 4);
    785       unsigned FrameNumOffset, absFrameNum, expectedPicOrderCnt;
    786 
    787       if (!sps->delta_pic_order_always_zero_flag) {
    788          unsigned delta_pic_order_cnt[2];
    789 
    790          delta_pic_order_cnt[0] = vl_rbsp_se(rbsp);
    791 
    792          if (delta_pic_order_cnt[0] != priv->codec_data.h264.delta_pic_order_cnt[0])
    793             vid_dec_h264_EndFrame(priv);
    794 
    795          priv->codec_data.h264.delta_pic_order_cnt[0] = delta_pic_order_cnt[0];
    796 
    797          if (pps->bottom_field_pic_order_in_frame_present_flag && !priv->picture.h264.field_pic_flag) {
    798             delta_pic_order_cnt[1] = vl_rbsp_se(rbsp);
    799 
    800             if (delta_pic_order_cnt[1] != priv->codec_data.h264.delta_pic_order_cnt[1])
    801                vid_dec_h264_EndFrame(priv);
    802 
    803             priv->codec_data.h264.delta_pic_order_cnt[1] = delta_pic_order_cnt[1];
    804          }
    805       }
    806 
    807       if (IdrPicFlag)
    808          FrameNumOffset = 0;
    809       else if (prevFrameNum > frame_num)
    810          FrameNumOffset = priv->codec_data.h264.prevFrameNumOffset + MaxFrameNum;
    811       else
    812          FrameNumOffset = priv->codec_data.h264.prevFrameNumOffset;
    813 
    814       priv->codec_data.h264.prevFrameNumOffset = FrameNumOffset;
    815 
    816       if (sps->num_ref_frames_in_pic_order_cnt_cycle != 0)
    817          absFrameNum = FrameNumOffset + frame_num;
    818       else
    819          absFrameNum = 0;
    820 
    821       if (nal_ref_idc == 0 && absFrameNum > 0)
    822          absFrameNum = absFrameNum - 1;
    823 
    824       if (absFrameNum > 0) {
    825          unsigned picOrderCntCycleCnt = (absFrameNum - 1) / sps->num_ref_frames_in_pic_order_cnt_cycle;
    826          unsigned frameNumInPicOrderCntCycle = (absFrameNum - 1) % sps->num_ref_frames_in_pic_order_cnt_cycle;
    827          signed ExpectedDeltaPerPicOrderCntCycle = 0;
    828          unsigned i;
    829 
    830          for (i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; ++i)
    831             ExpectedDeltaPerPicOrderCntCycle += sps->offset_for_ref_frame[i];
    832 
    833          expectedPicOrderCnt = picOrderCntCycleCnt * ExpectedDeltaPerPicOrderCntCycle;
    834          for (i = 0; i <= frameNumInPicOrderCntCycle; ++i)
    835             expectedPicOrderCnt += sps->offset_for_ref_frame[i];
    836 
    837       } else
    838          expectedPicOrderCnt = 0;
    839 
    840       if (nal_ref_idc == 0)
    841          expectedPicOrderCnt += sps->offset_for_non_ref_pic;
    842 
    843       if (!priv->picture.h264.field_pic_flag) {
    844          priv->picture.h264.field_order_cnt[0] = expectedPicOrderCnt + priv->codec_data.h264.delta_pic_order_cnt[0];
    845          priv->picture.h264.field_order_cnt[1] = priv->picture.h264.field_order_cnt[0] +
    846             sps->offset_for_top_to_bottom_field + priv->codec_data.h264.delta_pic_order_cnt[1];
    847 
    848       } else if (!priv->picture.h264.bottom_field_flag)
    849          priv->picture.h264.field_order_cnt[0] = expectedPicOrderCnt + priv->codec_data.h264.delta_pic_order_cnt[0];
    850       else
    851          priv->picture.h264.field_order_cnt[1] = expectedPicOrderCnt + sps->offset_for_top_to_bottom_field +
    852             priv->codec_data.h264.delta_pic_order_cnt[0];
    853 
    854    } else if (sps->pic_order_cnt_type == 2) {
    855       unsigned MaxFrameNum = 1 << (sps->log2_max_frame_num_minus4 + 4);
    856       unsigned FrameNumOffset, tempPicOrderCnt;
    857 
    858       if (IdrPicFlag)
    859          FrameNumOffset = 0;
    860       else if (prevFrameNum > frame_num)
    861          FrameNumOffset = priv->codec_data.h264.prevFrameNumOffset + MaxFrameNum;
    862       else
    863          FrameNumOffset = priv->codec_data.h264.prevFrameNumOffset;
    864 
    865       priv->codec_data.h264.prevFrameNumOffset = FrameNumOffset;
    866 
    867       if (IdrPicFlag)
    868          tempPicOrderCnt = 0;
    869       else if (nal_ref_idc == 0)
    870          tempPicOrderCnt = 2 * (FrameNumOffset + frame_num) - 1;
    871       else
    872          tempPicOrderCnt = 2 * (FrameNumOffset + frame_num);
    873 
    874       if (!priv->picture.h264.field_pic_flag) {
    875          priv->picture.h264.field_order_cnt[0] = tempPicOrderCnt;
    876          priv->picture.h264.field_order_cnt[1] = tempPicOrderCnt;
    877 
    878       } else if (!priv->picture.h264.bottom_field_flag)
    879          priv->picture.h264.field_order_cnt[0] = tempPicOrderCnt;
    880       else
    881          priv->picture.h264.field_order_cnt[1] = tempPicOrderCnt;
    882    }
    883 
    884    if (pps->redundant_pic_cnt_present_flag)
    885       /* redundant_pic_cnt */
    886       vl_rbsp_ue(rbsp);
    887 
    888    if (slice_type == PIPE_H264_SLICE_TYPE_B)
    889       /* direct_spatial_mv_pred_flag */
    890       vl_rbsp_u(rbsp, 1);
    891 
    892    priv->picture.h264.num_ref_idx_l0_active_minus1 = pps->num_ref_idx_l0_default_active_minus1;
    893    priv->picture.h264.num_ref_idx_l1_active_minus1 = pps->num_ref_idx_l1_default_active_minus1;
    894 
    895    if (slice_type == PIPE_H264_SLICE_TYPE_P ||
    896        slice_type == PIPE_H264_SLICE_TYPE_SP ||
    897        slice_type == PIPE_H264_SLICE_TYPE_B) {
    898 
    899       /* num_ref_idx_active_override_flag */
    900       if (vl_rbsp_u(rbsp, 1)) {
    901          priv->picture.h264.num_ref_idx_l0_active_minus1 = vl_rbsp_ue(rbsp);
    902 
    903          if (slice_type == PIPE_H264_SLICE_TYPE_B)
    904             priv->picture.h264.num_ref_idx_l1_active_minus1 = vl_rbsp_ue(rbsp);
    905       }
    906    }
    907 
    908    if (nal_unit_type == 20 || nal_unit_type == 21)
    909       ref_pic_list_mvc_modification(priv, rbsp);
    910    else
    911       ref_pic_list_modification(priv, rbsp, slice_type);
    912 
    913    if ((pps->weighted_pred_flag && (slice_type == PIPE_H264_SLICE_TYPE_P || slice_type == PIPE_H264_SLICE_TYPE_SP)) ||
    914        (pps->weighted_bipred_idc == 1 && slice_type == PIPE_H264_SLICE_TYPE_B))
    915       pred_weight_table(priv, rbsp, sps, slice_type);
    916 
    917    if (nal_ref_idc != 0)
    918       dec_ref_pic_marking(priv, rbsp, IdrPicFlag);
    919 
    920    if (pps->entropy_coding_mode_flag && slice_type != PIPE_H264_SLICE_TYPE_I && slice_type != PIPE_H264_SLICE_TYPE_SI)
    921       /* cabac_init_idc */
    922       vl_rbsp_ue(rbsp);
    923 
    924    /* slice_qp_delta */
    925    vl_rbsp_se(rbsp);
    926 
    927    if (slice_type == PIPE_H264_SLICE_TYPE_SP || slice_type == PIPE_H264_SLICE_TYPE_SI) {
    928       if (slice_type == PIPE_H264_SLICE_TYPE_SP)
    929          /* sp_for_switch_flag */
    930          vl_rbsp_u(rbsp, 1);
    931 
    932       /*slice_qs_delta */
    933       vl_rbsp_se(rbsp);
    934    }
    935 
    936    if (pps->deblocking_filter_control_present_flag) {
    937       unsigned disable_deblocking_filter_idc = vl_rbsp_ue(rbsp);
    938 
    939       if (disable_deblocking_filter_idc != 1) {
    940          /* slice_alpha_c0_offset_div2 */
    941          vl_rbsp_se(rbsp);
    942 
    943          /* slice_beta_offset_div2 */
    944          vl_rbsp_se(rbsp);
    945       }
    946    }
    947 
    948    if (pps->num_slice_groups_minus1 > 0 && pps->slice_group_map_type >= 3 && pps->slice_group_map_type <= 5)
    949       /* slice_group_change_cycle */
    950       vl_rbsp_u(rbsp, 2);
    951 }
    952 
    953 static void vid_dec_h264_Decode(vid_dec_PrivateType *priv, struct vl_vlc *vlc, unsigned min_bits_left)
    954 {
    955    unsigned nal_ref_idc, nal_unit_type;
    956 
    957    if (!vl_vlc_search_byte(vlc, vl_vlc_bits_left(vlc) - min_bits_left, 0x00))
    958       return;
    959 
    960    if (vl_vlc_peekbits(vlc, 24) != 0x000001) {
    961       vl_vlc_eatbits(vlc, 8);
    962       return;
    963    }
    964 
    965    if (priv->slice) {
    966       unsigned bytes = priv->bytes_left - (vl_vlc_bits_left(vlc) / 8);
    967       ++priv->picture.h264.slice_count;
    968       priv->codec->decode_bitstream(priv->codec, priv->target, &priv->picture.base,
    969                                     1, &priv->slice, &bytes);
    970       priv->slice = NULL;
    971    }
    972 
    973    vl_vlc_eatbits(vlc, 24);
    974 
    975    /* forbidden_zero_bit */
    976    vl_vlc_eatbits(vlc, 1);
    977 
    978    nal_ref_idc = vl_vlc_get_uimsbf(vlc, 2);
    979 
    980    if (nal_ref_idc != priv->codec_data.h264.nal_ref_idc &&
    981        (nal_ref_idc * priv->codec_data.h264.nal_ref_idc) == 0)
    982       vid_dec_h264_EndFrame(priv);
    983 
    984    priv->codec_data.h264.nal_ref_idc = nal_ref_idc;
    985 
    986    nal_unit_type = vl_vlc_get_uimsbf(vlc, 5);
    987 
    988    if (nal_unit_type != 1 && nal_unit_type != 5)
    989       vid_dec_h264_EndFrame(priv);
    990 
    991    if (nal_unit_type == 7) {
    992       struct vl_rbsp rbsp;
    993       vl_rbsp_init(&rbsp, vlc, ~0);
    994       seq_parameter_set(priv, &rbsp);
    995 
    996    } else if (nal_unit_type == 8) {
    997       struct vl_rbsp rbsp;
    998       vl_rbsp_init(&rbsp, vlc, ~0);
    999       picture_parameter_set(priv, &rbsp);
   1000 
   1001    } else if (nal_unit_type == 1 || nal_unit_type == 5) {
   1002       /* Coded slice of a non-IDR or IDR picture */
   1003       unsigned bits = vl_vlc_valid_bits(vlc);
   1004       unsigned bytes = bits / 8 + 4;
   1005       struct vl_rbsp rbsp;
   1006       uint8_t buf[8];
   1007       const void *ptr = buf;
   1008       unsigned i;
   1009 
   1010       buf[0] = 0x0;
   1011       buf[1] = 0x0;
   1012       buf[2] = 0x1;
   1013       buf[3] = (nal_ref_idc << 5) | nal_unit_type;
   1014       for (i = 4; i < bytes; ++i)
   1015          buf[i] = vl_vlc_peekbits(vlc, bits) >> ((bytes - i - 1) * 8);
   1016 
   1017       priv->bytes_left = (vl_vlc_bits_left(vlc) - bits) / 8;
   1018       priv->slice = vlc->data;
   1019 
   1020       vl_rbsp_init(&rbsp, vlc, 128);
   1021       slice_header(priv, &rbsp, nal_ref_idc, nal_unit_type);
   1022 
   1023       vid_dec_h264_BeginFrame(priv);
   1024 
   1025       ++priv->picture.h264.slice_count;
   1026       priv->codec->decode_bitstream(priv->codec, priv->target, &priv->picture.base,
   1027                                     1, &ptr, &bytes);
   1028    }
   1029 
   1030    /* resync to byte boundary */
   1031    vl_vlc_eatbits(vlc, vl_vlc_valid_bits(vlc) % 8);
   1032 }
   1033