14a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ------------------------------------------------------------------
24a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Copyright (C) 1998-2009 PacketVideo
34a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *
44a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
54a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * you may not use this file except in compliance with the License.
64a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * You may obtain a copy of the License at
74a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *
84a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
94a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *
104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Unless required by applicable law or agreed to in writing, software
114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * express or implied.
144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * See the License for the specific language governing permissions
154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * and limitations under the License.
164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * -------------------------------------------------------------------
174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber */
184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include "avcdec_lib.h"
194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include "avcdec_bitstream.h"
204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include "avcdec_api.h"
214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/** see subclause 7.4.2.1 */
234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status DecodeSPS(AVCDecObject *decvid, AVCDecBitstream *stream)
244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCDec_Status status = AVCDEC_SUCCESS;
264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSeqParamSet *seqParam;
274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint temp;
284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int i;
294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint profile_idc, constrained_set0_flag, constrained_set1_flag, constrained_set2_flag;
304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint level_idc, seq_parameter_set_id;
314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    void *userData = decvid->avcHandle->userData;
324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCHandle *avcHandle = decvid->avcHandle;
334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "DecodeSPS", -1, -1);
354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 8, &profile_idc);
374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &constrained_set0_flag);
384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//  if (profile_idc != 66 && constrained_set0_flag != 1)
394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//  {
404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//      return AVCDEC_FAIL;
414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//  }
424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &constrained_set1_flag);
434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &constrained_set2_flag);
444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 5, &temp);
454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 8, &level_idc);
464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (level_idc > 51)
474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (mapLev2Idx[level_idc] == 255)
514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &seq_parameter_set_id);
554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (seq_parameter_set_id > 31)
574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* Allocate sequence param set for seqParams[seq_parameter_set_id]. */
624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (decvid->seqParams[seq_parameter_set_id] == NULL)  /* allocate seqParams[id] */
634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        decvid->seqParams[seq_parameter_set_id] =
654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            (AVCSeqParamSet*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCSeqParamSet), DEFAULT_ATTR);
664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (decvid->seqParams[seq_parameter_set_id] == NULL)
684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_MEMORY_FAIL;
704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "done alloc seqParams", -1, -1);
744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam = decvid->seqParams[seq_parameter_set_id];
764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->profile_idc = profile_idc;
784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->constrained_set0_flag = constrained_set0_flag;
794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->constrained_set1_flag = constrained_set1_flag;
804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->constrained_set2_flag = constrained_set2_flag;
814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->level_idc = level_idc;
824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->seq_parameter_set_id = seq_parameter_set_id;
834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* continue decoding SPS */
854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &(seqParam->log2_max_frame_num_minus4));
864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (seqParam->log2_max_frame_num_minus4 > 12)
884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &(seqParam->pic_order_cnt_type));
934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "check point 1", seqParam->log2_max_frame_num_minus4, seqParam->pic_order_cnt_type);
954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (seqParam->pic_order_cnt_type == 0)
974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &(seqParam->log2_max_pic_order_cnt_lsb_minus4));
994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else if (seqParam->pic_order_cnt_type == 1)
1014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {               // MC_CHECK
1024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, (uint*)&(seqParam->delta_pic_order_always_zero_flag));
1034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        se_v32bit(stream, &(seqParam->offset_for_non_ref_pic));
1044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        se_v32bit(stream, &(seqParam->offset_for_top_to_bottom_field));
1054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &(seqParam->num_ref_frames_in_pic_order_cnt_cycle));
1064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (i = 0; i < (int)(seqParam->num_ref_frames_in_pic_order_cnt_cycle); i++)
1084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
1094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            se_v32bit(stream, &(seqParam->offset_for_ref_frame[i]));
1104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
1114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &(seqParam->num_ref_frames));
1144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (seqParam->num_ref_frames > 16)
1164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
1184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "check point 2", seqParam->num_ref_frames, -1);
1214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, (uint*)&(seqParam->gaps_in_frame_num_value_allowed_flag));
1234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &(seqParam->pic_width_in_mbs_minus1));
1244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "picwidth", seqParam->pic_width_in_mbs_minus1, -1);
1264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &(seqParam->pic_height_in_map_units_minus1));
1284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "picwidth", seqParam->pic_height_in_map_units_minus1, -1);
1304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, (uint*)&(seqParam->frame_mbs_only_flag));
1324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->mb_adaptive_frame_field_flag = 0; /* default value */
1344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (!seqParam->frame_mbs_only_flag)
1354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, (uint*)&(seqParam->mb_adaptive_frame_field_flag));
1374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "check point 3", seqParam->frame_mbs_only_flag, -1);
1404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, (uint*)&(seqParam->direct_8x8_inference_flag));
1424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "check point 4", seqParam->direct_8x8_inference_flag, -1);
1444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, (uint*)&(seqParam->frame_cropping_flag));
1464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->frame_crop_left_offset = 0;  /* default value */
1474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->frame_crop_right_offset = 0;/* default value */
1484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->frame_crop_top_offset = 0;/* default value */
1494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    seqParam->frame_crop_bottom_offset = 0;/* default value */
1504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (seqParam->frame_cropping_flag)
1514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &(seqParam->frame_crop_left_offset));
1534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &(seqParam->frame_crop_right_offset));
1544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &(seqParam->frame_crop_top_offset));
1554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &(seqParam->frame_crop_bottom_offset));
1564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "check point 5", seqParam->frame_cropping_flag, -1);
1594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, (uint*)&(seqParam->vui_parameters_present_flag));
1614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (seqParam->vui_parameters_present_flag)
1624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = vui_parameters(decvid, stream, seqParam);
1644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (status != AVCDEC_SUCCESS)
1654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
1664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL;
1674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
1684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return status;
1714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
1724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status vui_parameters(AVCDecObject *decvid, AVCDecBitstream *stream, AVCSeqParamSet *currSPS)
1754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
1764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint temp;
1774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint temp32;
1784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint aspect_ratio_idc, overscan_appopriate_flag, video_format, video_full_range_flag;
1794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* aspect_ratio_info_present_flag */
1804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
1814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (temp)
1824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, 8, &aspect_ratio_idc);
1844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (aspect_ratio_idc == 255)
1854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
1864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* sar_width */
1874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamReadBits(stream, 16, &temp);
1884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* sar_height */
1894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamReadBits(stream, 16, &temp);
1904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
1914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* overscan_info_present */
1934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
1944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (temp)
1954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &overscan_appopriate_flag);
1974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* video_signal_type_present_flag */
1994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
2004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (temp)
2014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, 3, &video_format);
2034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &video_full_range_flag);
2044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* colour_description_present_flag */
2054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &temp);
2064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (temp)
2074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* colour_primaries */
2094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamReadBits(stream, 8, &temp);
2104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* transfer_characteristics */
2114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamReadBits(stream, 8, &temp);
2124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* matrix coefficients */
2134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamReadBits(stream, 8, &temp);
2144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  chroma_loc_info_present_flag */
2174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
2184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (temp)
2194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  chroma_sample_loc_type_top_field */
2214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
2224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  chroma_sample_loc_type_bottom_field */
2234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
2244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  timing_info_present_flag*/
2274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
2284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (temp)
2294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  num_unit_in_tick*/
2314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, 32, &temp32);
2324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  time_scale */
2334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, 32, &temp32);
2344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  fixed_frame_rate_flag */
2354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &temp);
2364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  nal_hrd_parameters_present_flag */
2394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
2404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    currSPS->vui_parameters.nal_hrd_parameters_present_flag = temp;
2414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (temp)
2424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        hrd_parameters(decvid, stream, &(currSPS->vui_parameters.nal_hrd_parameters));
2444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  vcl_hrd_parameters_present_flag*/
2464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
2474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    currSPS->vui_parameters.vcl_hrd_parameters_present_flag = temp;
2484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (temp)
2494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        hrd_parameters(decvid, stream, &(currSPS->vui_parameters.vcl_hrd_parameters));
2514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currSPS->vui_parameters.nal_hrd_parameters_present_flag || currSPS->vui_parameters.vcl_hrd_parameters_present_flag)
2534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  low_delay_hrd_flag */
2554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &temp);
2564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  pic_struct_present_flag */
2584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
2594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    currSPS->vui_parameters.pic_struct_present_flag = temp;
2604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  bitstream_restriction_flag */
2614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
2624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (temp)
2634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  motion_vectors_over_pic_boundaries_flag */
2654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &temp);
2664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  max_bytes_per_pic_denom */
2674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
2684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  max_bits_per_mb_denom */
2694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
2704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  log2_max_mv_length_horizontal */
2714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
2724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  log2_max_mv_length_vertical */
2734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
2744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  num_reorder_frames */
2754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
2764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  max_dec_frame_buffering */
2774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
2784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
2804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
2814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status hrd_parameters(AVCDecObject *decvid, AVCDecBitstream *stream, AVCHRDParams *HRDParam)
2824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
2834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    OSCL_UNUSED_ARG(decvid);
2844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint temp;
2854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint cpb_cnt_minus1;
2864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint i;
2874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &cpb_cnt_minus1);
2884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    HRDParam->cpb_cnt_minus1 = cpb_cnt_minus1;
2894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  bit_rate_scale */
2904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 4, &temp);
2914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  cpb_size_scale */
2924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 4, &temp);
2934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (i = 0; i <= cpb_cnt_minus1; i++)
2944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  bit_rate_value_minus1[i] */
2964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
2974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  cpb_size_value_minus1[i] */
2984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
2994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /*  cbr_flag[i] */
3004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
3014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
3024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  initial_cpb_removal_delay_length_minus1 */
3034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 5, &temp);
3044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  cpb_removal_delay_length_minus1 */
3054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 5, &temp);
3064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    HRDParam->cpb_removal_delay_length_minus1 = temp;
3074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  dpb_output_delay_length_minus1 */
3084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 5, &temp);
3094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    HRDParam->dpb_output_delay_length_minus1 = temp;
3104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  time_offset_length  */
3114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 5, &temp);
3124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    HRDParam->time_offset_length = temp;
3134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
3144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
3154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/** see subclause 7.4.2.2 */
3184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status DecodePPS(AVCDecObject *decvid, AVCCommonObj *video, AVCDecBitstream *stream)
3194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
3204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCPicParamSet *picParam;
3214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCDec_Status status;
3224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int i, iGroup, numBits;
3234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int PicWidthInMbs, PicHeightInMapUnits, PicSizeInMapUnits;
3244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint pic_parameter_set_id, seq_parameter_set_id;
3254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    void *userData = decvid->avcHandle->userData;
3264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCHandle *avcHandle = decvid->avcHandle;
3274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &pic_parameter_set_id);
3294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (pic_parameter_set_id > 255)
3304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
3314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
3324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
3334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &seq_parameter_set_id);
3354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (seq_parameter_set_id > 31)
3374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
3384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
3394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
3404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* 2.1 if picParams[pic_param_set_id] is NULL, allocate it. */
3424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (decvid->picParams[pic_parameter_set_id] == NULL)
3434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
3444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        decvid->picParams[pic_parameter_set_id] =
3454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            (AVCPicParamSet*)avcHandle->CBAVC_Malloc(userData, sizeof(AVCPicParamSet), DEFAULT_ATTR);
3464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (decvid->picParams[pic_parameter_set_id] == NULL)
3474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
3484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_MEMORY_FAIL;
3494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        decvid->picParams[pic_parameter_set_id]->slice_group_id = NULL;
3524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
3534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->currPicParams = picParam = decvid->picParams[pic_parameter_set_id];
3554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    picParam->seq_parameter_set_id = seq_parameter_set_id;
3564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    picParam->pic_parameter_set_id = pic_parameter_set_id;
3574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, (uint*)&(picParam->entropy_coding_mode_flag));
3594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (picParam->entropy_coding_mode_flag)
3604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
3614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = AVCDEC_FAIL;
3624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        goto clean_up;
3634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
3644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, (uint*)&(picParam->pic_order_present_flag));
3654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &(picParam->num_slice_groups_minus1));
3664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (picParam->num_slice_groups_minus1 > MAX_NUM_SLICE_GROUP - 1)
3684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
3694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = AVCDEC_FAIL;
3704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        goto clean_up;
3714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
3724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    picParam->slice_group_change_rate_minus1 = 0; /* default value */
3744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (picParam->num_slice_groups_minus1 > 0)
3754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
3764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &(picParam->slice_group_map_type));
3774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (picParam->slice_group_map_type == 0)
3784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
3794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            for (iGroup = 0; iGroup <= (int)picParam->num_slice_groups_minus1; iGroup++)
3804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
3814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                ue_v(stream, &(picParam->run_length_minus1[iGroup]));
3824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
3834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else if (picParam->slice_group_map_type == 2)
3854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {   // MC_CHECK  <= or <
3864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            for (iGroup = 0; iGroup < (int)picParam->num_slice_groups_minus1; iGroup++)
3874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
3884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                ue_v(stream, &(picParam->top_left[iGroup]));
3894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                ue_v(stream, &(picParam->bottom_right[iGroup]));
3904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
3914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else if (picParam->slice_group_map_type == 3 ||
3934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                 picParam->slice_group_map_type == 4 ||
3944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                 picParam->slice_group_map_type == 5)
3954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
3964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamRead1Bit(stream, (uint*)&(picParam->slice_group_change_direction_flag));
3974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ue_v(stream, &(picParam->slice_group_change_rate_minus1));
3984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else if (picParam->slice_group_map_type == 6)
4004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
4014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ue_v(stream, &(picParam->pic_size_in_map_units_minus1));
4024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            numBits = 0;/* ceil(log2(num_slice_groups_minus1+1)) bits */
4044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            i = picParam->num_slice_groups_minus1;
4054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            while (i > 0)
4064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
4074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                numBits++;
4084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                i >>= 1;
4094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
4104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            i = picParam->seq_parameter_set_id;
4124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (decvid->seqParams[i] == NULL)
4134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
4144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                status = AVCDEC_FAIL;
4154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                goto clean_up;
4164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
4174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            PicWidthInMbs = decvid->seqParams[i]->pic_width_in_mbs_minus1 + 1;
4204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            PicHeightInMapUnits = decvid->seqParams[i]->pic_height_in_map_units_minus1 + 1 ;
4214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            PicSizeInMapUnits = PicWidthInMbs * PicHeightInMapUnits ;
4224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* information has to be consistent with the seq_param */
4244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if ((int)picParam->pic_size_in_map_units_minus1 != PicSizeInMapUnits - 1)
4254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
4264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                status = AVCDEC_FAIL;
4274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                goto clean_up;
4284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
4294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (picParam->slice_group_id)
4314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
4324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                avcHandle->CBAVC_Free(userData, (int)picParam->slice_group_id);
4334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
4344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            picParam->slice_group_id = (uint*)avcHandle->CBAVC_Malloc(userData, sizeof(uint) * PicSizeInMapUnits, DEFAULT_ATTR);
4354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (picParam->slice_group_id == NULL)
4364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
4374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                status =  AVCDEC_MEMORY_FAIL;
4384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                goto clean_up;
4394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
4404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            for (i = 0; i < PicSizeInMapUnits; i++)
4424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
4434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamReadBits(stream, numBits, &(picParam->slice_group_id[i]));
4444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
4454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
4464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &(picParam->num_ref_idx_l0_active_minus1));
4504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (picParam->num_ref_idx_l0_active_minus1 > 31)
4514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = AVCDEC_FAIL; /* out of range */
4534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        goto clean_up;
4544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &(picParam->num_ref_idx_l1_active_minus1));
4574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (picParam->num_ref_idx_l1_active_minus1 > 31)
4584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = AVCDEC_FAIL; /* out of range */
4604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        goto clean_up;
4614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, (uint*)&(picParam->weighted_pred_flag));
4644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 2, &(picParam->weighted_bipred_idc));
4654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (picParam->weighted_bipred_idc > 2)
4664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = AVCDEC_FAIL; /* out of range */
4684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        goto clean_up;
4694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    se_v(stream, &(picParam->pic_init_qp_minus26));
4724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (picParam->pic_init_qp_minus26 < -26 || picParam->pic_init_qp_minus26 > 25)
4734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = AVCDEC_FAIL; /* out of range */
4754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        goto clean_up;
4764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    se_v(stream, &(picParam->pic_init_qs_minus26));
4794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (picParam->pic_init_qs_minus26 < -26 || picParam->pic_init_qs_minus26 > 25)
4804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = AVCDEC_FAIL; /* out of range */
4824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        goto clean_up;
4834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    se_v(stream, &(picParam->chroma_qp_index_offset));
4864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (picParam->chroma_qp_index_offset < -12 || picParam->chroma_qp_index_offset > 12)
4874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = AVCDEC_FAIL; /* out of range */
4894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = AVCDEC_FAIL; /* out of range */
4904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        goto clean_up;
4914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 3, &pic_parameter_set_id);
4944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    picParam->deblocking_filter_control_present_flag = pic_parameter_set_id >> 2;
4954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    picParam->constrained_intra_pred_flag = (pic_parameter_set_id >> 1) & 1;
4964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    picParam->redundant_pic_cnt_present_flag = pic_parameter_set_id & 1;
4974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
4994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberclean_up:
5004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (decvid->picParams[pic_parameter_set_id])
5014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (picParam->slice_group_id)
5034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
5044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            avcHandle->CBAVC_Free(userData, (int)picParam->slice_group_id);
5054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
5064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        decvid->picParams[pic_parameter_set_id]->slice_group_id = NULL;
5074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        avcHandle->CBAVC_Free(userData, (int)decvid->picParams[pic_parameter_set_id]);
5084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        decvid->picParams[pic_parameter_set_id] = NULL;
5094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return status;
5104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
5124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
5134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* FirstPartOfSliceHeader();
5164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    RestOfSliceHeader() */
5174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/** see subclause 7.4.3 */
5184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status DecodeSliceHeader(AVCDecObject *decvid, AVCCommonObj *video, AVCDecBitstream *stream)
5194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
5204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSliceHeader *sliceHdr = video->sliceHdr;
5214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCPicParamSet *currPPS;
5224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSeqParamSet *currSPS;
5234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCDec_Status status;
5244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint idr_pic_id;
5254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int slice_type, temp, i;
5264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &(sliceHdr->first_mb_in_slice));
5284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, (uint*)&slice_type);
5294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (sliceHdr->first_mb_in_slice != 0)
5314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if ((int)sliceHdr->slice_type >= 5 && slice_type != (int)sliceHdr->slice_type - 5)
5334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
5344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL; /* slice type doesn't follow the first slice in the picture */
5354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
5364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    sliceHdr->slice_type = (AVCSliceType) slice_type;
5384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (slice_type > 4)
5394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        slice_type -= 5;
5414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (slice_type == 1 || slice_type > 2)
5444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
5464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->slice_type = (AVCSliceType) slice_type;
5494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &(sliceHdr->pic_parameter_set_id));
5514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* end FirstPartSliceHeader() */
5524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* begin RestOfSliceHeader() */
5534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* after getting pic_parameter_set_id, we have to load corresponding SPS and PPS */
5544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (sliceHdr->pic_parameter_set_id > 255)
5554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
5574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (decvid->picParams[sliceHdr->pic_parameter_set_id] == NULL)
5604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL; /* PPS doesn't exist */
5614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    currPPS = video->currPicParams = decvid->picParams[sliceHdr->pic_parameter_set_id];
5634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (decvid->seqParams[currPPS->seq_parameter_set_id] == NULL)
5654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL; /* SPS doesn't exist */
5664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    currSPS = video->currSeqParams = decvid->seqParams[currPPS->seq_parameter_set_id];
5684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currPPS->seq_parameter_set_id != video->seq_parameter_set_id)
5704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->seq_parameter_set_id = currPPS->seq_parameter_set_id;
5724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = (AVCDec_Status)AVCConfigureSequence(decvid->avcHandle, video, false);
5734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (status != AVCDEC_SUCCESS)
5744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return status;
5754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->level_idc = currSPS->level_idc;
5764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* derived variables from SPS */
5794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->MaxFrameNum = 1 << (currSPS->log2_max_frame_num_minus4 + 4);
5804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    // MC_OPTIMIZE
5814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->PicWidthInMbs = currSPS->pic_width_in_mbs_minus1 + 1;
5824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->PicWidthInSamplesL = video->PicWidthInMbs * 16 ;
5834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->PicWidthInSamplesC = video->PicWidthInMbs * 8 ;
5844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->PicHeightInMapUnits = currSPS->pic_height_in_map_units_minus1 + 1 ;
5854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->PicSizeInMapUnits = video->PicWidthInMbs * video->PicHeightInMapUnits ;
5864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->FrameHeightInMbs = (2 - currSPS->frame_mbs_only_flag) * video->PicHeightInMapUnits ;
5874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* derived from PPS */
5894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->SliceGroupChangeRate = currPPS->slice_group_change_rate_minus1 + 1;
5904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* then we can continue decoding slice header */
5924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, currSPS->log2_max_frame_num_minus4 + 4, &(sliceHdr->frame_num));
5944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (video->currFS == NULL && sliceHdr->frame_num != 0)
5964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->prevFrameNum = video->PrevRefFrameNum = sliceHdr->frame_num - 1;
5984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (!currSPS->frame_mbs_only_flag)
6014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
6024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &(sliceHdr->field_pic_flag));
6034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->field_pic_flag)
6044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
6054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL;
6064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
6074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
6084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* derived variables from slice header*/
6104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->PicHeightInMbs = video->FrameHeightInMbs;
6114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->PicHeightInSamplesL = video->PicHeightInMbs * 16;
6124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->PicHeightInSamplesC = video->PicHeightInMbs * 8;
6134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->PicSizeInMbs = video->PicWidthInMbs * video->PicHeightInMbs;
6144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (sliceHdr->first_mb_in_slice >= video->PicSizeInMbs)
6164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
6174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
6184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
6194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->MaxPicNum = video->MaxFrameNum;
6204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->CurrPicNum = sliceHdr->frame_num;
6214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (video->nal_unit_type == AVC_NALTYPE_IDR)
6244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
6254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->frame_num != 0)
6264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
6274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL;
6284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
6294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &idr_pic_id);
6304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
6314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    sliceHdr->delta_pic_order_cnt_bottom = 0; /* default value */
6334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    sliceHdr->delta_pic_order_cnt[0] = 0; /* default value */
6344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    sliceHdr->delta_pic_order_cnt[1] = 0; /* default value */
6354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currSPS->pic_order_cnt_type == 0)
6364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
6374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, currSPS->log2_max_pic_order_cnt_lsb_minus4 + 4,
6384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                          &(sliceHdr->pic_order_cnt_lsb));
6394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->MaxPicOrderCntLsb =  1 << (currSPS->log2_max_pic_order_cnt_lsb_minus4 + 4);
6404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->pic_order_cnt_lsb > video->MaxPicOrderCntLsb - 1)
6414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL; /* out of range */
6424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (currPPS->pic_order_present_flag)
6444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
6454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            se_v32bit(stream, &(sliceHdr->delta_pic_order_cnt_bottom));
6464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
6474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
6484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currSPS->pic_order_cnt_type == 1 && !currSPS->delta_pic_order_always_zero_flag)
6494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
6504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        se_v32bit(stream, &(sliceHdr->delta_pic_order_cnt[0]));
6514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (currPPS->pic_order_present_flag)
6524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
6534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            se_v32bit(stream, &(sliceHdr->delta_pic_order_cnt[1]));
6544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
6554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
6564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    sliceHdr->redundant_pic_cnt = 0; /* default value */
6584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currPPS->redundant_pic_cnt_present_flag)
6594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
6604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        // MC_CHECK
6614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &(sliceHdr->redundant_pic_cnt));
6624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->redundant_pic_cnt > 127) /* out of range */
6634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL;
6644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->redundant_pic_cnt > 0) /* redundant picture */
6664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL; /* not supported */
6674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
6684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    sliceHdr->num_ref_idx_l0_active_minus1 = currPPS->num_ref_idx_l0_active_minus1;
6694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    sliceHdr->num_ref_idx_l1_active_minus1 = currPPS->num_ref_idx_l1_active_minus1;
6704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (slice_type == AVC_P_SLICE)
6724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
6734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &(sliceHdr->num_ref_idx_active_override_flag));
6744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->num_ref_idx_active_override_flag)
6754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
6764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ue_v(stream, &(sliceHdr->num_ref_idx_l0_active_minus1));
6774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
6784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else  /* the following condition is not allowed if the flag is zero */
6794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
6804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if ((slice_type == AVC_P_SLICE) && currPPS->num_ref_idx_l0_active_minus1 > 15)
6814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                return AVCDEC_FAIL; /* not allowed */
6834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
6854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
6864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (sliceHdr->num_ref_idx_l0_active_minus1 > 15 ||
6894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            sliceHdr->num_ref_idx_l1_active_minus1 > 15)
6904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
6914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL; /* not allowed */
6924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
6934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* if MbaffFrameFlag =1,
6944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    max value of index is num_ref_idx_l0_active_minus1 for frame MBs and
6954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    2*sliceHdr->num_ref_idx_l0_active_minus1 + 1 for field MBs */
6964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* ref_pic_list_reordering() */
6984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    status = ref_pic_list_reordering(video, stream, sliceHdr, slice_type);
6994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (status != AVCDEC_SUCCESS)
7004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
7014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return status;
7024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
7034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (video->nal_ref_idc != 0)
7064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
7074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        dec_ref_pic_marking(video, stream, sliceHdr);
7084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
7094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    se_v(stream, &(sliceHdr->slice_qp_delta));
7104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->QPy = 26 + currPPS->pic_init_qp_minus26 + sliceHdr->slice_qp_delta;
7124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (video->QPy > 51 || video->QPy < 0)
7134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
7144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->QPy = AVC_CLIP3(0, 51, video->QPy);
7154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//                  return AVCDEC_FAIL;
7164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
7174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->QPc = mapQPi2QPc[AVC_CLIP3(0, 51, video->QPy + video->currPicParams->chroma_qp_index_offset)];
7184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->QPy_div_6 = (video->QPy * 43) >> 8;
7204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->QPy_mod_6 = video->QPy - 6 * video->QPy_div_6;
7214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->QPc_div_6 = (video->QPc * 43) >> 8;
7234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->QPc_mod_6 = video->QPc - 6 * video->QPc_div_6;
7244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    sliceHdr->slice_alpha_c0_offset_div2 = 0;
7264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    sliceHdr->slice_beta_offset_div_2 = 0;
7274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    sliceHdr->disable_deblocking_filter_idc = 0;
7284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->FilterOffsetA = video->FilterOffsetB = 0;
7294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currPPS->deblocking_filter_control_present_flag)
7314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
7324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &(sliceHdr->disable_deblocking_filter_idc));
7334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->disable_deblocking_filter_idc > 2)
7344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
7354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL; /* out of range */
7364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
7374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->disable_deblocking_filter_idc != 1)
7384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
7394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            se_v(stream, &(sliceHdr->slice_alpha_c0_offset_div2));
7404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (sliceHdr->slice_alpha_c0_offset_div2 < -6 ||
7414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    sliceHdr->slice_alpha_c0_offset_div2 > 6)
7424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
7434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                return AVCDEC_FAIL;
7444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
7454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->FilterOffsetA = sliceHdr->slice_alpha_c0_offset_div2 << 1;
7464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            se_v(stream, &(sliceHdr->slice_beta_offset_div_2));
7484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (sliceHdr->slice_beta_offset_div_2 < -6 ||
7494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    sliceHdr->slice_beta_offset_div_2 > 6)
7504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
7514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                return AVCDEC_FAIL;
7524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
7534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->FilterOffsetB = sliceHdr->slice_beta_offset_div_2 << 1;
7544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
7554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
7564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currPPS->num_slice_groups_minus1 > 0 && currPPS->slice_group_map_type >= 3
7584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            && currPPS->slice_group_map_type <= 5)
7594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
7604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* Ceil(Log2(PicSizeInMapUnits/(float)SliceGroupChangeRate + 1)) */
7614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        temp = video->PicSizeInMapUnits / video->SliceGroupChangeRate;
7624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (video->PicSizeInMapUnits % video->SliceGroupChangeRate)
7634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
7644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            temp++;
7654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
7664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        i = 0;
7674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        temp++;
7684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        while (temp)
7694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
7704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            temp >>= 1;
7714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            i++;
7724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
7734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, i, &(sliceHdr->slice_group_change_cycle));
7754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->MapUnitsInSliceGroup0 =
7764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            AVC_MIN(sliceHdr->slice_group_change_cycle * video->SliceGroupChangeRate, video->PicSizeInMapUnits);
7774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
7784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
7804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
7814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status fill_frame_num_gap(AVCHandle *avcHandle, AVCCommonObj *video)
7844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
7854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCDec_Status status;
7864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int CurrFrameNum;
7874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int UnusedShortTermFrameNum;
7884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int tmp1 = video->sliceHdr->delta_pic_order_cnt[0];
7894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int tmp2 = video->sliceHdr->delta_pic_order_cnt[1];
7904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int tmp3 = video->CurrPicNum;
7914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int tmp4 = video->sliceHdr->adaptive_ref_pic_marking_mode_flag;
7924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    UnusedShortTermFrameNum = (video->prevFrameNum + 1) % video->MaxFrameNum;
7934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    CurrFrameNum = video->sliceHdr->frame_num;
7944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->sliceHdr->delta_pic_order_cnt[0] = 0;
7964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->sliceHdr->delta_pic_order_cnt[1] = 0;
7974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    while (CurrFrameNum != UnusedShortTermFrameNum)
7984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
7994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->CurrPicNum = UnusedShortTermFrameNum;
8004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->sliceHdr->frame_num = UnusedShortTermFrameNum;
8014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = (AVCDec_Status)DPBInitBuffer(avcHandle, video);
8034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (status != AVCDEC_SUCCESS)  /* no buffer available */
8044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
8054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return status;
8064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
8074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        DecodePOC(video);
8084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        DPBInitPic(video, UnusedShortTermFrameNum);
8094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->currFS->PicOrderCnt = video->PicOrderCnt;
8124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->currFS->FrameNum = video->sliceHdr->frame_num;
8134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* initialize everything to zero */
8154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->currFS->IsOutputted = 0x01;
8164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->currFS->IsReference = 3;
8174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->currFS->IsLongTerm = 0;
8184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->currFS->frame.isReference = TRUE;
8194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->currFS->frame.isLongTerm = FALSE;
8204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->sliceHdr->adaptive_ref_pic_marking_mode_flag = 0;
8224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = (AVCDec_Status)StorePictureInDPB(avcHandle, video);  // MC_CHECK check the return status
8244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (status != AVCDEC_SUCCESS)
8254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
8264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL;
8274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
8284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->prevFrameNum = UnusedShortTermFrameNum;
8294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        UnusedShortTermFrameNum = (UnusedShortTermFrameNum + 1) % video->MaxFrameNum;
8304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
8314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->sliceHdr->frame_num = CurrFrameNum;
8324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->CurrPicNum = tmp3;
8334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->sliceHdr->delta_pic_order_cnt[0] = tmp1;
8344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->sliceHdr->delta_pic_order_cnt[1] = tmp2;
8354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->sliceHdr->adaptive_ref_pic_marking_mode_flag = tmp4;
8364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
8374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
8384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/** see subclause 7.4.3.1 */
8404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status ref_pic_list_reordering(AVCCommonObj *video, AVCDecBitstream *stream, AVCSliceHeader *sliceHdr, int slice_type)
8414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
8424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int i;
8434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (slice_type != AVC_I_SLICE)
8454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
8464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &(sliceHdr->ref_pic_list_reordering_flag_l0));
8474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->ref_pic_list_reordering_flag_l0)
8484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
8494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            i = 0;
8504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            do
8514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
8524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                ue_v(stream, &(sliceHdr->reordering_of_pic_nums_idc_l0[i]));
8534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (sliceHdr->reordering_of_pic_nums_idc_l0[i] == 0 ||
8544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        sliceHdr->reordering_of_pic_nums_idc_l0[i] == 1)
8554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
8564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    ue_v(stream, &(sliceHdr->abs_diff_pic_num_minus1_l0[i]));
8574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (sliceHdr->reordering_of_pic_nums_idc_l0[i] == 0 &&
8584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            sliceHdr->abs_diff_pic_num_minus1_l0[i] > video->MaxPicNum / 2 - 1)
8594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
8604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        return AVCDEC_FAIL; /* out of range */
8614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
8624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (sliceHdr->reordering_of_pic_nums_idc_l0[i] == 1 &&
8634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            sliceHdr->abs_diff_pic_num_minus1_l0[i] > video->MaxPicNum / 2 - 2)
8644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
8654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        return AVCDEC_FAIL; /* out of range */
8664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
8674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
8684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else if (sliceHdr->reordering_of_pic_nums_idc_l0[i] == 2)
8694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
8704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    ue_v(stream, &(sliceHdr->long_term_pic_num_l0[i]));
8714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
8724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                i++;
8734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
8744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            while (sliceHdr->reordering_of_pic_nums_idc_l0[i-1] != 3
8754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    && i <= (int)sliceHdr->num_ref_idx_l0_active_minus1 + 1) ;
8764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
8774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
8784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
8794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
8804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
8814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/** see subclause 7.4.3.3 */
8824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status dec_ref_pic_marking(AVCCommonObj *video, AVCDecBitstream *stream, AVCSliceHeader *sliceHdr)
8834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
8844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int i;
8854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (video->nal_unit_type == AVC_NALTYPE_IDR)
8864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
8874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &(sliceHdr->no_output_of_prior_pics_flag));
8884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &(sliceHdr->long_term_reference_flag));
8894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->long_term_reference_flag == 0) /* used for short-term */
8904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
8914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->MaxLongTermFrameIdx = -1; /* no long-term frame indx */
8924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
8934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else /* used for long-term */
8944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
8954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->MaxLongTermFrameIdx = 0;
8964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->LongTermFrameIdx = 0;
8974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
8984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
8994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
9004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
9014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &(sliceHdr->adaptive_ref_pic_marking_mode_flag));
9024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->adaptive_ref_pic_marking_mode_flag)
9034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
9044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            i = 0;
9054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            do
9064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                ue_v(stream, &(sliceHdr->memory_management_control_operation[i]));
9084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (sliceHdr->memory_management_control_operation[i] == 1 ||
9094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        sliceHdr->memory_management_control_operation[i] == 3)
9104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
9114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    ue_v(stream, &(sliceHdr->difference_of_pic_nums_minus1[i]));
9124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
9134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (sliceHdr->memory_management_control_operation[i] == 2)
9144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
9154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    ue_v(stream, &(sliceHdr->long_term_pic_num[i]));
9164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
9174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (sliceHdr->memory_management_control_operation[i] == 3 ||
9184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        sliceHdr->memory_management_control_operation[i] == 6)
9194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
9204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    ue_v(stream, &(sliceHdr->long_term_frame_idx[i]));
9214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
9224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (sliceHdr->memory_management_control_operation[i] == 4)
9234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
9244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    ue_v(stream, &(sliceHdr->max_long_term_frame_idx_plus1[i]));
9254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
9264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                i++;
9274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            while (sliceHdr->memory_management_control_operation[i-1] != 0 && i < MAX_DEC_REF_PIC_MARKING);
9294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (i >= MAX_DEC_REF_PIC_MARKING)
9304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                return AVCDEC_FAIL; /* we're screwed!!, not enough memory */
9324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
9344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
9354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
9374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
9384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* see subclause 8.2.1 Decoding process for picture order count. */
9404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status DecodePOC(AVCCommonObj *video)
9414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
9424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSeqParamSet *currSPS = video->currSeqParams;
9434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSliceHeader *sliceHdr = video->sliceHdr;
9444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int i;
9454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    switch (currSPS->pic_order_cnt_type)
9474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
9484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 0: /* POC MODE 0 , subclause 8.2.1.1 */
9494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->nal_unit_type == AVC_NALTYPE_IDR)
9504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->prevPicOrderCntMsb = 0;
9524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->prevPicOrderCntLsb = 0;
9534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* Calculate the MSBs of current picture */
9564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (sliceHdr->pic_order_cnt_lsb  <  video->prevPicOrderCntLsb  &&
9574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    (video->prevPicOrderCntLsb - sliceHdr->pic_order_cnt_lsb)  >= (video->MaxPicOrderCntLsb / 2))
9584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->PicOrderCntMsb = video->prevPicOrderCntMsb + video->MaxPicOrderCntLsb;
9594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else if (sliceHdr->pic_order_cnt_lsb  >  video->prevPicOrderCntLsb  &&
9604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                     (sliceHdr->pic_order_cnt_lsb - video->prevPicOrderCntLsb)  > (video->MaxPicOrderCntLsb / 2))
9614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->PicOrderCntMsb = video->prevPicOrderCntMsb - video->MaxPicOrderCntLsb;
9624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else
9634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->PicOrderCntMsb = video->prevPicOrderCntMsb;
9644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* JVT-I010 page 81 is different from JM7.3 */
9664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->PicOrderCnt = video->TopFieldOrderCnt = video->PicOrderCntMsb + sliceHdr->pic_order_cnt_lsb;
9694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->BottomFieldOrderCnt = video->TopFieldOrderCnt + sliceHdr->delta_pic_order_cnt_bottom;
9704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            break;
9724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 1: /* POC MODE 1, subclause 8.2.1.2 */
9754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* calculate FrameNumOffset */
9764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->nal_unit_type == AVC_NALTYPE_IDR)
9774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->prevFrameNumOffset = 0;
9794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->FrameNumOffset = 0;
9804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else if (video->prevFrameNum > sliceHdr->frame_num)
9824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->FrameNumOffset = video->prevFrameNumOffset + video->MaxFrameNum;
9844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else
9864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->FrameNumOffset = video->prevFrameNumOffset;
9884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* calculate absFrameNum */
9904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (currSPS->num_ref_frames_in_pic_order_cnt_cycle)
9914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->absFrameNum = video->FrameNumOffset + sliceHdr->frame_num;
9934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else
9954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
9964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->absFrameNum = 0;
9974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
9984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
9994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->absFrameNum > 0 && video->nal_ref_idc == 0)
10004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->absFrameNum--;
10024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* derive picOrderCntCycleCnt and frameNumInPicOrderCntCycle */
10054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->absFrameNum > 0)
10064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->picOrderCntCycleCnt = (video->absFrameNum - 1) / currSPS->num_ref_frames_in_pic_order_cnt_cycle;
10084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->frameNumInPicOrderCntCycle = (video->absFrameNum - 1) % currSPS->num_ref_frames_in_pic_order_cnt_cycle;
10094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* derive expectedDeltaPerPicOrderCntCycle */
10114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->expectedDeltaPerPicOrderCntCycle = 0;
10124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            for (i = 0; i < (int)currSPS->num_ref_frames_in_pic_order_cnt_cycle; i++)
10134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->expectedDeltaPerPicOrderCntCycle += currSPS->offset_for_ref_frame[i];
10154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* derive expectedPicOrderCnt */
10174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->absFrameNum)
10184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->expectedPicOrderCnt = video->picOrderCntCycleCnt * video->expectedDeltaPerPicOrderCntCycle;
10204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                for (i = 0; i <= video->frameNumInPicOrderCntCycle; i++)
10214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
10224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    video->expectedPicOrderCnt += currSPS->offset_for_ref_frame[i];
10234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
10244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else
10264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->expectedPicOrderCnt = 0;
10284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->nal_ref_idc == 0)
10314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->expectedPicOrderCnt += currSPS->offset_for_non_ref_pic;
10334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* derive TopFieldOrderCnt and BottomFieldOrderCnt */
10354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->TopFieldOrderCnt = video->expectedPicOrderCnt + sliceHdr->delta_pic_order_cnt[0];
10374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->BottomFieldOrderCnt = video->TopFieldOrderCnt + currSPS->offset_for_top_to_bottom_field + sliceHdr->delta_pic_order_cnt[1];
10384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->PicOrderCnt = AVC_MIN(video->TopFieldOrderCnt, video->BottomFieldOrderCnt);
10404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            break;
10434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 2: /* POC MODE 2, subclause 8.2.1.3 */
10464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->nal_unit_type == AVC_NALTYPE_IDR)
10474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->FrameNumOffset = 0;
10494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else if (video->prevFrameNum > sliceHdr->frame_num)
10514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->FrameNumOffset = video->prevFrameNumOffset + video->MaxFrameNum;
10534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else
10554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->FrameNumOffset = video->prevFrameNumOffset;
10574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* derive tempPicOrderCnt, we just use PicOrderCnt */
10594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->nal_unit_type == AVC_NALTYPE_IDR)
10604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->PicOrderCnt = 0;
10624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else if (video->nal_ref_idc == 0)
10644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->PicOrderCnt = 2 * (video->FrameNumOffset + sliceHdr->frame_num) - 1;
10664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else
10684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
10694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->PicOrderCnt = 2 * (video->FrameNumOffset + sliceHdr->frame_num);
10704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
10714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->TopFieldOrderCnt = video->BottomFieldOrderCnt = video->PicOrderCnt;
10724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            break;
10734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        default:
10744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL;
10754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
10764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
10784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
10794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status DecodeSEI(AVCDecObject *decvid, AVCDecBitstream *stream)
10824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
10834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    OSCL_UNUSED_ARG(decvid);
10844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    OSCL_UNUSED_ARG(stream);
10854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
10864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
10874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
10884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status sei_payload(AVCDecObject *decvid, AVCDecBitstream *stream, uint payloadType, uint payloadSize)
10894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
10904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCDec_Status status = AVCDEC_SUCCESS;
10914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint i;
10924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    switch (payloadType)
10934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
10944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 0:
10954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /*  buffering period SEI */
10964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            status = buffering_period(decvid, stream);
10974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            break;
10984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 1:
10994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /*  picture timing SEI */
11004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            status = pic_timing(decvid, stream);
11014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            break;
11024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 2:
11034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 3:
11054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 4:
11074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 5:
11094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 8:
11114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 9:
11134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 10:
11154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 11:
11174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 12:
11194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 13:
11214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 14:
11234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 15:
11254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 16:
11274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 17:
11294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            for (i = 0; i < payloadSize; i++)
11304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
11314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamFlushBits(stream, 8);
11324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
11334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            break;
11344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 6:
11354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /*      recovery point SEI              */
11364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            status = recovery_point(decvid, stream);
11374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            break;
11384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 7:
11394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /*      decoded reference picture marking repetition SEI */
11404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            status = dec_ref_pic_marking_repetition(decvid, stream);
11414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            break;
11424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        case 18:
11444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /*      motion-constrained slice group set SEI */
11454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            status = motion_constrained_slice_group_set(decvid, stream);
11464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            break;
11474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        default:
11484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /*          reserved_sei_message */
11494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            for (i = 0; i < payloadSize; i++)
11504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
11514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamFlushBits(stream, 8);
11524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
11534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            break;
11544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
11554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamByteAlign(stream);
11564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return status;
11574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
11584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status buffering_period(AVCDecObject *decvid, AVCDecBitstream *stream)
11604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
11614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSeqParamSet *currSPS;
11624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint seq_parameter_set_id;
11634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint temp;
11644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint i;
11654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &seq_parameter_set_id);
11664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (seq_parameter_set_id > 31)
11674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
11684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
11694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
11704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//  decvid->common->seq_parameter_set_id = seq_parameter_set_id;
11724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    currSPS = decvid->seqParams[seq_parameter_set_id];
11744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currSPS->vui_parameters.nal_hrd_parameters_present_flag)
11754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
11764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (i = 0; i <= currSPS->vui_parameters.nal_hrd_parameters.cpb_cnt_minus1; i++)
11774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
11784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* initial_cpb_removal_delay[i] */
11794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamReadBits(stream, currSPS->vui_parameters.nal_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
11804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /*initial _cpb_removal_delay_offset[i] */
11814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamReadBits(stream, currSPS->vui_parameters.nal_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
11824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
11834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
11844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currSPS->vui_parameters.vcl_hrd_parameters_present_flag)
11864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
11874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (i = 0; i <= currSPS->vui_parameters.vcl_hrd_parameters.cpb_cnt_minus1; i++)
11884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
11894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* initial_cpb_removal_delay[i] */
11904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamReadBits(stream, currSPS->vui_parameters.vcl_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
11914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /*initial _cpb_removal_delay_offset[i] */
11924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamReadBits(stream, currSPS->vui_parameters.vcl_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
11934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
11944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
11954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
11964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
11974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
11984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status pic_timing(AVCDecObject *decvid, AVCDecBitstream *stream)
11994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
12004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSeqParamSet *currSPS;
12014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint temp, NumClockTs = 0, time_offset_length = 24, full_timestamp_flag;
12024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint i;
12034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    currSPS = decvid->seqParams[decvid->common->seq_parameter_set_id];
12054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currSPS->vui_parameters.nal_hrd_parameters_present_flag)
12074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
12084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, currSPS->vui_parameters.nal_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
12094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, currSPS->vui_parameters.nal_hrd_parameters.dpb_output_delay_length_minus1 + 1, &temp);
12104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        time_offset_length = currSPS->vui_parameters.nal_hrd_parameters.time_offset_length;
12114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
12124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else if (currSPS->vui_parameters.vcl_hrd_parameters_present_flag)
12134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
12144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, currSPS->vui_parameters.vcl_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
12154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, currSPS->vui_parameters.vcl_hrd_parameters.dpb_output_delay_length_minus1 + 1, &temp);
12164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        time_offset_length = currSPS->vui_parameters.vcl_hrd_parameters.time_offset_length;
12174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
12184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currSPS->vui_parameters.pic_struct_present_flag)
12204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
12214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* pic_struct */
12224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, 4, &temp);
12234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        switch (temp)
12254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
12264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            case 0:
12274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            case 1:
12284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            case 2:
12294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                NumClockTs = 1;
12304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                break;
12314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            case 3:
12324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            case 4:
12334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            case 7:
12344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                NumClockTs = 2;
12354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                break;
12364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            case 5:
12374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            case 6:
12384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            case 8:
12394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                NumClockTs = 3;
12404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                break;
12414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            default:
12424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                NumClockTs = 0;
12434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                break;
12444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
12454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (i = 0; i < NumClockTs; i++)
12474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
12484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* clock_timestamp_flag[i] */
12494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamRead1Bit(stream, &temp);
12504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (temp)
12514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
12524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                /* ct_type */
12534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamReadBits(stream, 2, &temp);
12544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                /* nuit_field_based_flag */
12554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamRead1Bit(stream, &temp);
12564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                /* counting_type        */
12574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamReadBits(stream, 5, &temp);
12584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                /* full_timestamp_flag */
12594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamRead1Bit(stream, &temp);
12604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                full_timestamp_flag = temp;
12614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                /* discontinuity_flag */
12624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamRead1Bit(stream, &temp);
12634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                /* cnt_dropped_flag */
12644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamRead1Bit(stream, &temp);
12654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                /* n_frames           */
12664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamReadBits(stream, 8, &temp);
12674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (full_timestamp_flag)
12704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
12714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    /* seconds_value */
12724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    BitstreamReadBits(stream, 6, &temp);
12734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    /* minutes_value */
12744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    BitstreamReadBits(stream, 6, &temp);
12754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    /* hours_value */
12764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    BitstreamReadBits(stream, 5, &temp);
12774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
12784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else
12794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
12804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    /* seconds_flag  */
12814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    BitstreamRead1Bit(stream, &temp);
12824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (temp)
12834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
12844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        /* seconds_value */
12854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        BitstreamReadBits(stream, 6, &temp);
12864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        /* minutes_flag  */
12874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        BitstreamRead1Bit(stream, &temp);
12884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        if (temp)
12894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        {
12904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            /* minutes_value */
12914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            BitstreamReadBits(stream, 6, &temp);
12924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            /* hourss_flag  */
12944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            BitstreamRead1Bit(stream, &temp);
12954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
12964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            if (temp)
12974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            {
12984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                /* hours_value */
12994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                BitstreamReadBits(stream, 5, &temp);
13004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                            }
13014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        }
13034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
13044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
13054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (time_offset_length)
13074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
13084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    /* time_offset */
13094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    BitstreamReadBits(stream, time_offset_length, &temp);
13104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
13114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else
13124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
13134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    /* time_offset */
13144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    temp = 0;
13154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
13164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
13174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
13184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
13194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
13204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
13214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status recovery_point(AVCDecObject *decvid, AVCDecBitstream *stream)
13224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
13234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    OSCL_UNUSED_ARG(decvid);
13244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint temp;
13254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* recover_frame_cnt */
13264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &temp);
13274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* exact_match_flag */
13284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
13294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* broken_link_flag */
13304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
13314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* changing slic_group_idc */
13324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamReadBits(stream, 2, &temp);
13334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
13344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
13354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status dec_ref_pic_marking_repetition(AVCDecObject *decvid, AVCDecBitstream *stream)
13364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
13374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSeqParamSet *currSPS;
13384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint temp;
13394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    currSPS = decvid->seqParams[decvid->common->seq_parameter_set_id];
13404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* original_idr_flag */
13414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
13424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* original_frame_num */
13434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &temp);
13444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currSPS->frame_mbs_only_flag == 0)
13454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
13464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* original_field_pic_flag */
13474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamRead1Bit(stream, &temp);
13484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (temp)
13494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
13504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* original_bottom_field_flag */
13514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamRead1Bit(stream, &temp);
13524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
13534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
13544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  dec_ref_pic_marking(video,stream,sliceHdr); */
13564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
13594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
13604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status motion_constrained_slice_group_set(AVCDecObject *decvid, AVCDecBitstream *stream)
13614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
13624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    OSCL_UNUSED_ARG(decvid);
13634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint temp, i, numBits;
13644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* num_slice_groups_in_set_minus1 */
13654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    ue_v(stream, &temp);
13664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    numBits = 0;/* ceil(log2(num_slice_groups_minus1+1)) bits */
13684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    i = temp;
13694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    while (i > 0)
13704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
13714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        numBits++;
13724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        i >>= 1;
13734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
13744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (i = 0; i <= temp; i++)
13754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
13764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* slice_group_id */
13774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        BitstreamReadBits(stream, numBits, &temp);
13784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
13794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* exact_sample_value_match_flag */
13804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
13814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* pan_scan_rect_flag */
13824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    BitstreamRead1Bit(stream, &temp);
13834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (temp)
13844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
13854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* pan_scan_rect_id */
13864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &temp);
13874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
13884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
13894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
13904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
13914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1392