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