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/** 194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberThis file contains application function interfaces to the AVC decoder library. 204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber@publishedAll 214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber*/ 224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include <string.h> 244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include "avcdec_api.h" 264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include "avcdec_lib.h" 274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include "avcdec_bitstream.h" 284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Function : EBSPtoRBSP() */ 314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Date : 11/4/2003 */ 324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Purpose : Convert EBSP to RBSP and overwrite it. */ 334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Assuming that forbidden_zero, nal_ref_idc and nal_unit_type */ 344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* (first byte), has been taken out of the nal_unit. */ 354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* In/out : */ 364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Return : */ 374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Modified : */ 384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/** 404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber@pseudocode " 414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber NumBytesInRBSP = 0; 424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for(i=0:i< *size; i++){ 434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if(i+2 < *size && next_bits(24)==0x000003){ 444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber rbsp_byte[NumBytesInRBSP++]; 454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber rbsp_byte[NumBytesInRBSP++]; 464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber i+=2; 474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber emulation_prevention_three_byte (0x03) 484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber rbsp_byte[NumBytesInRBSP++]; 514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber }" 524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber*/ 534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status EBSPtoRBSP(uint8 *nal_unit, int *size) 544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int i, j; 564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int count = 0; 574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* This code is based on EBSPtoRBSP of JM */ 594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber j = 0; 604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < *size; i++) 624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (count == 2 && nal_unit[i] == 0x03) 644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber i++; 664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber count = 0; 674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber nal_unit[j] = nal_unit[i]; 694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (nal_unit[i] == 0x00) 704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber count++; 714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber count = 0; 734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber j++; 744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *size = j; 774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_SUCCESS; 794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Function : PVAVCAnnexBGetNALUnit() */ 834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Date : 11/3/2003 */ 844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Purpose : Parse a NAL from byte stream format. */ 854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* In/out : */ 864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Return : AVCDEC_SUCCESS if succeed, AVC_FAIL if fail. */ 874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Modified : */ 884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/** 904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber@pseudocode " 914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber byte_stream_nal_unit(NumBytesInNalunit){ 924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber while(next_bits(24) != 0x000001) 934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber zero_byte 944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if(more_data_in_byte_stream()){ 954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber start_code_prefix_one_3bytes // equal 0x000001 964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber nal_unit(NumBytesInNALunit) 974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber }" 994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber*/ 1004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF AVCDec_Status PVAVCAnnexBGetNALUnit(uint8 *bitstream, uint8 **nal_unit, 1014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int *size) 1024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 1034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int i, j, FoundStartCode = 0; 1044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int end; 1054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber i = 0; 1074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber while (bitstream[i] == 0 && i < *size) 1084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber i++; 1104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (i >= *size) 1124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *nal_unit = bitstream; 1144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; /* cannot find any start_code_prefix. */ 1154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else if (bitstream[i] != 0x1) 1174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber i = -1; /* start_code_prefix is not at the beginning, continue */ 1194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber i++; 1224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *nal_unit = bitstream + i; /* point to the beginning of the NAL unit */ 1234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber j = end = i; 1254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber while (!FoundStartCode) 1264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber while ((j + 1 < *size) && (bitstream[j] != 0 || bitstream[j+1] != 0)) /* see 2 consecutive zero bytes */ 1284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber j++; 1304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber end = j; /* stop and check for start code */ 1324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber while (j + 2 < *size && bitstream[j+2] == 0) /* keep reading for zero byte */ 1334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber j++; 1354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (j + 2 >= *size) 1374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *size -= i; 1394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_NO_NEXT_SC; /* cannot find the second start_code_prefix */ 1404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (bitstream[j+2] == 0x1) 1424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber FoundStartCode = 1; 1444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 1464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* could be emulation code 0x3 */ 1484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber j += 2; /* continue the search */ 1494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *size = end - i; 1534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_SUCCESS; 1554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 1564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 1584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Function : PVAVCGetNALType() */ 1594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Date : 11/4/2003 */ 1604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Purpose : Sniff NAL type from the bitstream */ 1614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* In/out : */ 1624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Return : AVCDEC_SUCCESS if succeed, AVC_FAIL if fail. */ 1634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Modified : */ 1644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 1654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF AVCDec_Status PVAVCDecGetNALType(uint8 *bitstream, int size, 1664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int *nal_type, int *nal_ref_idc) 1674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 1684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int forbidden_zero_bit; 1694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (size > 0) 1704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber forbidden_zero_bit = bitstream[0] >> 7; 1724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (forbidden_zero_bit != 0) 1734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 1744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *nal_ref_idc = (bitstream[0] & 0x60) >> 5; 1754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *nal_type = bitstream[0] & 0x1F; 1764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_SUCCESS; 1774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 1804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 1814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 1834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Function : PVAVCDecSeqParamSet() */ 1844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Date : 11/4/2003 */ 1854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Purpose : Initialize sequence, memory allocation if necessary. */ 1864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* In/out : */ 1874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Return : AVCDEC_SUCCESS if succeed, AVC_FAIL if fail. */ 1884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Modified : */ 1894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 1904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF AVCDec_Status PVAVCDecSeqParamSet(AVCHandle *avcHandle, uint8 *nal_unit, 1924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int nal_size) 1934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 1944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDec_Status status; 1954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecObject *decvid; 1964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCCommonObj *video; 1974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecBitstream *bitstream; 1984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber void *userData = avcHandle->userData; 1994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber bool first_seq = FALSE; 2004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int i; 2014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "PVAVCDecSeqParamSet", -1, -1); 2044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avcHandle->AVCObject == NULL) 2064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber first_seq = TRUE; 2084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber //avcHandle->memory_usage = 0; 2104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* allocate AVCDecObject */ 2114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->AVCObject = (void*)avcHandle->CBAVC_Malloc(userData, sizeof(AVCDecObject), 0/*DEFAULT_ATTR*/); 2124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avcHandle->AVCObject == NULL) 2134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_MEMORY_FAIL; 2154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber decvid = (AVCDecObject*) avcHandle->AVCObject; 2184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber memset(decvid, 0, sizeof(AVCDecObject)); 2204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber decvid->common = (AVCCommonObj*)avcHandle->CBAVC_Malloc(userData, sizeof(AVCCommonObj), 0); 2224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid->common == NULL) 2234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_MEMORY_FAIL; 2254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video = decvid->common; 2284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber memset(video, 0, sizeof(AVCCommonObj)); 2294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->seq_parameter_set_id = 9999; /* set it to some illegal value */ 2314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber decvid->bitstream = (AVCDecBitstream *) avcHandle->CBAVC_Malloc(userData, sizeof(AVCDecBitstream), 1/*DEFAULT_ATTR*/); 2334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid->bitstream == NULL) 2344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_MEMORY_FAIL; 2364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber decvid->bitstream->userData = avcHandle->userData; /* callback for more data */ 2394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber decvid->avcHandle = avcHandle; 2404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber decvid->debugEnable = avcHandle->debugEnable; 2414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber decvid = (AVCDecObject*) avcHandle->AVCObject; 2444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video = decvid->common; 2454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber bitstream = decvid->bitstream; 2464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* check if we can reuse the memory without re-allocating it. */ 2484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* always check if(first_seq==TRUE) */ 2494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* Conversion from EBSP to RBSP */ 2514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->forbidden_bit = nal_unit[0] >> 7; 2524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->forbidden_bit) return AVCDEC_FAIL; 2534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_ref_idc = (nal_unit[0] & 0x60) >> 5; 2544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_unit_type = (AVCNalUnitType)(nal_unit[0] & 0x1F); 2554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->nal_unit_type != AVC_NALTYPE_SPS) /* not a SPS NAL */ 2574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 2594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* Initialize bitstream structure*/ 2624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber BitstreamInit(bitstream, nal_unit + 1, nal_size - 1); 2634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* if first_seq == TRUE, allocate the following memory */ 2654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (first_seq == TRUE) 2664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currSeqParams = NULL; /* initialize it to NULL */ 2684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currPicParams = NULL; 2694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* There are 32 pointers to sequence param set, seqParams. 2714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber There are 255 pointers to picture param set, picParams.*/ 2724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < 32; i++) 2734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber decvid->seqParams[i] = NULL; 2744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < 256; i++) 2764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber decvid->picParams[i] = NULL; 2774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->MbToSliceGroupMap = NULL; 2794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mem_mgr_ctrl_eq_5 = FALSE; 2814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->newPic = TRUE; 2824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->newSlice = TRUE; 2834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currPic = NULL; 2844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currFS = NULL; 2854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevRefPic = NULL; 2864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbNum = 0; // MC_Conceal 2884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* Allocate sliceHdr. */ 2894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->sliceHdr = (AVCSliceHeader*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCSliceHeader), 5/*DEFAULT_ATTR*/); 2914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->sliceHdr == NULL) 2924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_MEMORY_FAIL; 2944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->decPicBuf = (AVCDecPicBuffer*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCDecPicBuffer), 3/*DEFAULT_ATTR*/); 2974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->decPicBuf == NULL) 2984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_MEMORY_FAIL; 3004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber memset(video->decPicBuf, 0, sizeof(AVCDecPicBuffer)); 3024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* Decode SPS, allocate video->seqParams[i] and assign video->currSeqParams */ 3054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber status = DecodeSPS(decvid, bitstream); 3064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (status != AVCDEC_SUCCESS) 3084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return status; 3104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_SUCCESS; 3124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 3134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 3154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Function : PVAVCDecGetSeqInfo() */ 3164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Date : 11/4/2003 */ 3174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Purpose : Get sequence parameter info. after SPS NAL is decoded. */ 3184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* In/out : */ 3194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Return : AVCDEC_SUCCESS if succeed, AVC_FAIL if fail. */ 3204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Modified : */ 3214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* 12/20/03: change input argument, use structure instead. */ 3224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 3234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF AVCDec_Status PVAVCDecGetSeqInfo(AVCHandle *avcHandle, AVCDecSPSInfo *seqInfo) 3254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 3264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecObject *decvid = (AVCDecObject*) avcHandle->AVCObject; 3274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCCommonObj *video; 3284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int PicWidthInMbs, PicHeightInMapUnits, FrameHeightInMbs; 3294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid == NULL || decvid->seqParams[0] == NULL) 3314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 3334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video = decvid->common; 3364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber PicWidthInMbs = decvid->seqParams[0]->pic_width_in_mbs_minus1 + 1; 3384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber PicHeightInMapUnits = decvid->seqParams[0]->pic_height_in_map_units_minus1 + 1 ; 3394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber FrameHeightInMbs = (2 - decvid->seqParams[0]->frame_mbs_only_flag) * PicHeightInMapUnits ; 3404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->FrameWidth = PicWidthInMbs << 4; 3424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->FrameHeight = FrameHeightInMbs << 4; 3434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->frame_only_flag = decvid->seqParams[0]->frame_mbs_only_flag; 3454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid->seqParams[0]->frame_cropping_flag) 3474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->frame_crop_left = 2 * decvid->seqParams[0]->frame_crop_left_offset; 3494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->frame_crop_right = seqInfo->FrameWidth - (2 * decvid->seqParams[0]->frame_crop_right_offset + 1); 3504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (seqInfo->frame_only_flag) 3524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->frame_crop_top = 2 * decvid->seqParams[0]->frame_crop_top_offset; 3544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->frame_crop_bottom = seqInfo->FrameHeight - (2 * decvid->seqParams[0]->frame_crop_bottom_offset + 1); 3554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* Note in 7.4.2.1, there is a contraint on the value of frame_crop_left and frame_crop_top 3564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber such that they have to be less than or equal to frame_crop_right/2 and frame_crop_bottom/2, respectively. */ 3574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 3594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->frame_crop_top = 4 * decvid->seqParams[0]->frame_crop_top_offset; 3614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->frame_crop_bottom = seqInfo->FrameHeight - (4 * decvid->seqParams[0]->frame_crop_bottom_offset + 1); 3624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* Note in 7.4.2.1, there is a contraint on the value of frame_crop_left and frame_crop_top 3634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber such that they have to be less than or equal to frame_crop_right/2 and frame_crop_bottom/4, respectively. */ 3644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else /* no cropping flag, just give the first and last pixel */ 3674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->frame_crop_bottom = seqInfo->FrameHeight - 1; 3694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->frame_crop_right = seqInfo->FrameWidth - 1; 3704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber seqInfo->frame_crop_top = seqInfo->frame_crop_left = 0; 3714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_SUCCESS; 3744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 3754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 3774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Function : PVAVCDecPicParamSet() */ 3784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Date : 11/4/2003 */ 3794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Purpose : Initialize picture */ 3804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* create reference picture list. */ 3814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* In/out : */ 3824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Return : AVCDEC_SUCCESS if succeed, AVC_FAIL if fail. */ 3834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Modified : */ 3844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 3854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/** 3864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberSince PPS doesn't contain much data, most of the picture initialization will 3874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberbe done after decoding the slice header in PVAVCDecodeSlice. */ 3884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF AVCDec_Status PVAVCDecPicParamSet(AVCHandle *avcHandle, uint8 *nal_unit, 3894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int nal_size) 3904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 3914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDec_Status status; 3924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecObject *decvid = (AVCDecObject*) avcHandle->AVCObject; 3934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCCommonObj *video; 3944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecBitstream *bitstream; 3954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid == NULL) 3974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 3994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video = decvid->common; 4024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber bitstream = decvid->bitstream; 4034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 1. Convert EBSP to RBSP. Create bitstream structure */ 4044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->forbidden_bit = nal_unit[0] >> 7; 4054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_ref_idc = (nal_unit[0] & 0x60) >> 5; 4064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_unit_type = (AVCNalUnitType)(nal_unit[0] & 0x1F); 4074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->nal_unit_type != AVC_NALTYPE_PPS) /* not a PPS NAL */ 4094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 4114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 2. Initialize bitstream structure*/ 4154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber BitstreamInit(bitstream, nal_unit + 1, nal_size - 1); 4164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 2. Decode pic_parameter_set_rbsp syntax. Allocate video->picParams[i] and assign to currPicParams */ 4184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber status = DecodePPS(decvid, video, bitstream); 4194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (status != AVCDEC_SUCCESS) 4204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return status; 4224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->SliceGroupChangeRate = video->currPicParams->slice_group_change_rate_minus1 + 1 ; 4254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_SUCCESS; 4274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 4284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF AVCDec_Status PVAVCDecSEI(AVCHandle *avcHandle, uint8 *nal_unit, 4304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int nal_size) 4314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 4324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber OSCL_UNUSED_ARG(avcHandle); 4334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber OSCL_UNUSED_ARG(nal_unit); 4344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber OSCL_UNUSED_ARG(nal_size); 4354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_SUCCESS; 4374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 4384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 4394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Function : PVAVCDecodeSlice() */ 4404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Date : 11/4/2003 */ 4414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Purpose : Decode one NAL unit. */ 4424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* In/out : */ 4434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Return : See enum AVCDec_Status for return values. */ 4444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Modified : */ 4454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 4464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF AVCDec_Status PVAVCDecodeSlice(AVCHandle *avcHandle, uint8 *buffer, 4474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int buf_size) 4484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 4494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecObject *decvid = (AVCDecObject*) avcHandle->AVCObject; 4504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCCommonObj *video; 4514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecBitstream *bitstream; 4524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDec_Status status; 4534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid == NULL) 4554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 4574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video = decvid->common; 4604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber bitstream = decvid->bitstream; 4614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mem_mgr_ctrl_eq_5) 4634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_PICTURE_OUTPUT_READY; // to flushout frame buffers 4654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->newSlice) 4684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 2. Check NAL type */ 4704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (buffer == NULL) 4714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 4734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prev_nal_unit_type = video->nal_unit_type; 4754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->forbidden_bit = buffer[0] >> 7; 4764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_ref_idc = (buffer[0] & 0x60) >> 5; 4774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_unit_type = (AVCNalUnitType)(buffer[0] & 0x1F); 4784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->nal_unit_type == AVC_NALTYPE_AUD) 4814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_SUCCESS; 4834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->nal_unit_type != AVC_NALTYPE_SLICE && 4864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_unit_type != AVC_NALTYPE_IDR) 4874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; /* not supported */ 4894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->nal_unit_type >= 2 && video->nal_unit_type <= 4) 4944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; /* not supported */ 4964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 4984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->slice_data_partitioning = FALSE; 5004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->newSlice = FALSE; 5034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* Initialize bitstream structure*/ 5044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber BitstreamInit(bitstream, buffer + 1, buf_size - 1); 5054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 2.1 Decode Slice Header (separate function)*/ 5084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber status = DecodeSliceHeader(decvid, video, bitstream); 5094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (status != AVCDEC_SUCCESS) 5104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 5114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->newSlice = TRUE; 5124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return status; 5134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->sliceHdr->frame_num != video->prevFrameNum || (video->sliceHdr->first_mb_in_slice < (uint)video->mbNum && video->currSeqParams->constrained_set1_flag == 1)) 5164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 5174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->newPic = TRUE; 5184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->numMBs > 0) 5194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 5204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber // Conceal missing MBs of previously decoded frame 5214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber ConcealSlice(decvid, video->PicSizeInMbs - video->numMBs, video->PicSizeInMbs); // Conceal 5224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->numMBs = 0; 5234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber // DeblockPicture(video); // No need to deblock 5254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 3.2 Decoded frame reference marking. */ 5274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 3.3 Put the decoded picture in output buffers */ 5284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* set video->mem_mge_ctrl_eq_5 */ 5294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCNalUnitType temp = video->nal_unit_type; 5304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_unit_type = video->prev_nal_unit_type; 5314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber StorePictureInDPB(avcHandle, video); 5324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_unit_type = temp; 5334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbNum = 0; // MC_Conceal 5344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_PICTURE_OUTPUT_READY; 5354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->nal_unit_type == AVC_NALTYPE_IDR) 5394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 5404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevFrameNum = 0; 5414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->PrevRefFrameNum = 0; 5424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (!video->currSeqParams->gaps_in_frame_num_value_allowed_flag) 5454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { /* no gaps allowed, frame_num has to increase by one only */ 5464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* if(sliceHdr->frame_num != (video->PrevRefFrameNum + 1)%video->MaxFrameNum) */ 5474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->sliceHdr->frame_num != video->PrevRefFrameNum && video->sliceHdr->frame_num != (video->PrevRefFrameNum + 1) % video->MaxFrameNum) 5484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 5494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber // Conceal missing MBs of previously decoded frame 5504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->numMBs = 0; 5514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->newPic = TRUE; 5524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevFrameNum++; // FIX 5534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->PrevRefFrameNum++; 5544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCNalUnitType temp = video->nal_unit_type; 5554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_unit_type = AVC_NALTYPE_SLICE; //video->prev_nal_unit_type; 5564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber status = (AVCDec_Status)DPBInitBuffer(avcHandle, video); 5574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (status != AVCDEC_SUCCESS) 5584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 5594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return status; 5604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currFS->IsOutputted = 0x01; 5624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currFS->IsReference = 3; 5634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currFS->IsLongTerm = 0; 5644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber DecodePOC(video); 5664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* find an empty memory from DPB and assigned to currPic */ 5674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber DPBInitPic(video, video->PrevRefFrameNum % video->MaxFrameNum); 5684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber RefListInit(video); 5694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber ConcealSlice(decvid, 0, video->PicSizeInMbs); // Conceal 5704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currFS->IsOutputted |= 0x02; 5714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber //conceal frame 5724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 3.2 Decoded frame reference marking. */ 5734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 3.3 Put the decoded picture in output buffers */ 5744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* set video->mem_mge_ctrl_eq_5 */ 5754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbNum = 0; // Conceal 5764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber StorePictureInDPB(avcHandle, video); 5774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->nal_unit_type = temp; 5784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_PICTURE_OUTPUT_READY; 5804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->newPic == TRUE) 5854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 5864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber status = (AVCDec_Status)DPBInitBuffer(avcHandle, video); 5874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (status != AVCDEC_SUCCESS) 5884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 5894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return status; 5904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 5924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->newSlice = TRUE; 5944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* function pointer setting at slice-level */ 5964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber // OPTIMIZE 5974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber decvid->residual_block = &residual_block_cavlc; 5984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 5994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* derive picture order count */ 6004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->newPic == TRUE) 6014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->numMBs = video->PicSizeInMbs; 6034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->nal_unit_type != AVC_NALTYPE_IDR && video->currSeqParams->gaps_in_frame_num_value_allowed_flag) 6054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->sliceHdr->frame_num != (video->PrevRefFrameNum + 1) % video->MaxFrameNum) 6074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber status = fill_frame_num_gap(avcHandle, video); 6094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (status != AVCDEC_SUCCESS) 6104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->numMBs = 0; 6124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return status; 6134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 6144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber status = (AVCDec_Status)DPBInitBuffer(avcHandle, video); 6164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (status != AVCDEC_SUCCESS) 6174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->numMBs = 0; 6194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return status; 6204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 6214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 6244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 6254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* if there's gap in the frame_num, we have to fill in the gap with 6264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber imaginary frames that won't get used for short-term ref. */ 6274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* see fill_frame_num_gap() in JM */ 6284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber DecodePOC(video); 6314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* find an empty memory from DPB and assigned to currPic */ 6324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber DPBInitPic(video, video->CurrPicNum); 6334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currPic->isReference = TRUE; // FIX 6354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->nal_ref_idc == 0) 6374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currPic->isReference = FALSE; 6394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currFS->IsOutputted |= 0x02; /* The MASK 0x02 means not needed for reference, or returned */ 6404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* node need to check for freeing of this buffer */ 6414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 6424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber FMOInit(video); 6444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->currPic->isReference) 6464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->PrevRefFrameNum = video->sliceHdr->frame_num; 6484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 6494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevFrameNum = video->sliceHdr->frame_num; 6524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 6534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->newPic = FALSE; 6554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* Initialize refListIdx for this picture */ 6584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber RefListInit(video); 6594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* Re-order the reference list according to the ref_pic_list_reordering() */ 6614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber status = (AVCDec_Status)ReOrderList(video); 6624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (status != AVCDEC_SUCCESS) 6634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 6654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 6664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 2.2 Decode Slice. */ 6684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber status = (AVCDec_Status)DecodeSlice(decvid); 6694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->slice_id++; // slice 6714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (status == AVCDEC_PICTURE_READY) 6734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 3. Check complete picture */ 6754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifndef MB_BASED_DEBLOCK 6764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 3.1 Deblock */ 6774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber DeblockPicture(video); 6784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif 6794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 3.2 Decoded frame reference marking. */ 6804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* 3.3 Put the decoded picture in output buffers */ 6814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* set video->mem_mge_ctrl_eq_5 */ 6824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber status = (AVCDec_Status)StorePictureInDPB(avcHandle, video); // CHECK check the retunr status 6834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (status != AVCDEC_SUCCESS) 6844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 6864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 6874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mem_mgr_ctrl_eq_5) 6894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->PrevRefFrameNum = 0; 6914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevFrameNum = 0; 6924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevPicOrderCntMsb = 0; 6934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevPicOrderCntLsb = video->TopFieldOrderCnt; 6944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevFrameNumOffset = 0; 6954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 6964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 6974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 6984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevPicOrderCntMsb = video->PicOrderCntMsb; 6994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevPicOrderCntLsb = video->sliceHdr->pic_order_cnt_lsb; 7004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevFrameNumOffset = video->FrameNumOffset; 7014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 7034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_PICTURE_READY; 7044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else if (status != AVCDEC_SUCCESS) 7064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 7084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 7104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_SUCCESS; 7114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 7124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 7134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 7144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Function : PVAVCDecGetOutput() */ 7154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Date : 11/3/2003 */ 7164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Purpose : Get the next picture according to PicOrderCnt. */ 7174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* In/out : */ 7184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Return : AVCFrameIO structure */ 7194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Modified : */ 7204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 7214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 7224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF AVCDec_Status PVAVCDecGetOutput(AVCHandle *avcHandle, int *indx, int *release, AVCFrameIO *output) 7234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 7244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecObject *decvid = (AVCDecObject*) avcHandle->AVCObject; 7254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCCommonObj *video; 7264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecPicBuffer *dpb; 7274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCFrameStore *oldestFrame = NULL; 7284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int i, first = 1; 7294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int count_frame = 0; 7304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int index = 0; 7314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int min_poc = 0; 7324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 7334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid == NULL) 7344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 7364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 7384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video = decvid->common; 7394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb = video->decPicBuf; 7404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 7414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (dpb->num_fs == 0) 7424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 7444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 7464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* search for the oldest frame_num in dpb */ 7474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* extension to field decoding, we have to search for every top_field/bottom_field within 7484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber each frame in the dpb. This code only works for frame based.*/ 7494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 7504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mem_mgr_ctrl_eq_5 == FALSE) 7514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < dpb->num_fs; i++) 7534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if ((dpb->fs[i]->IsOutputted & 0x01) == 0) 7554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber count_frame++; 7574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (first) 7584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber min_poc = dpb->fs[i]->PicOrderCnt; 7604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber first = 0; 7614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber oldestFrame = dpb->fs[i]; 7624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber index = i; 7634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (dpb->fs[i]->PicOrderCnt < min_poc) 7654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber min_poc = dpb->fs[i]->PicOrderCnt; 7674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber oldestFrame = dpb->fs[i]; 7684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber index = i; 7694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 7744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < dpb->num_fs; i++) 7764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if ((dpb->fs[i]->IsOutputted & 0x01) == 0 && dpb->fs[i] != video->currFS) 7784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber count_frame++; 7804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (first) 7814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber min_poc = dpb->fs[i]->PicOrderCnt; 7834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber first = 0; 7844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber oldestFrame = dpb->fs[i]; 7854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber index = i; 7864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (dpb->fs[i]->PicOrderCnt < min_poc) 7884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber min_poc = dpb->fs[i]->PicOrderCnt; 7904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber oldestFrame = dpb->fs[i]; 7914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber index = i; 7924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 7954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 7964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (count_frame < 2 && video->nal_unit_type != AVC_NALTYPE_IDR) 7974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 7984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mem_mgr_ctrl_eq_5 = FALSE; // FIX 7994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else if (count_frame < 1 && video->nal_unit_type == AVC_NALTYPE_IDR) 8014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < dpb->num_fs; i++) 8034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (dpb->fs[i] == video->currFS && (dpb->fs[i]->IsOutputted & 0x01) == 0) 8054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber oldestFrame = dpb->fs[i]; 8074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber index = i; 8084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber break; 8094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mem_mgr_ctrl_eq_5 = FALSE; 8124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (oldestFrame == NULL) 8164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* Check for Mem_mgmt_operation_5 based forced output */ 8194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < dpb->num_fs; i++) 8204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* looking for the one not used or not reference and has been outputted */ 8224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (dpb->fs[i]->IsReference == 0 && dpb->fs[i]->IsOutputted == 3) 8234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber break; 8254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (i < dpb->num_fs) 8284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* there are frames available for decoding */ 8304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; /* no frame to be outputted */ 8314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* no free frame available, we have to release one to continue decoding */ 8354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int MinIdx = 0; 8364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int32 MinFrameNumWrap = 0x7FFFFFFF; 8374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < dpb->num_fs; i++) 8394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (dpb->fs[i]->IsReference && !dpb->fs[i]->IsLongTerm) 8414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (dpb->fs[i]->FrameNumWrap < MinFrameNumWrap) 8434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber MinFrameNumWrap = dpb->fs[i]->FrameNumWrap; 8454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber MinIdx = i; 8464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* mark the frame with smallest PicOrderCnt to be unused for reference */ 8504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb->fs[MinIdx]->IsReference = 0; 8514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb->fs[MinIdx]->IsLongTerm = 0; 8524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb->fs[MinIdx]->frame.isReference = FALSE; 8534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb->fs[MinIdx]->frame.isLongTerm = FALSE; 8544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb->fs[MinIdx]->IsOutputted |= 0x02; 8554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef PV_MEMORY_POOL 8564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (dpb->fs[MinIdx]->IsOutputted == 3) 8574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_FrameUnbind(avcHandle->userData, MinIdx); 8594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif 8614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_FAIL; 8624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* MASK 0x01 means the frame is outputted (for display). A frame gets freed when it is 8644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber outputted (0x01) and not needed for reference (0x02) */ 8654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber oldestFrame->IsOutputted |= 0x01; 8664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (oldestFrame->IsOutputted == 3) 8684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *release = 1; /* flag to release the buffer */ 8704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 8724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 8734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *release = 0; 8744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 8754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* do not release buffer here, release it after it is sent to the sink node */ 8764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber output->YCbCr[0] = oldestFrame->frame.Sl; 8784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber output->YCbCr[1] = oldestFrame->frame.Scb; 8794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber output->YCbCr[2] = oldestFrame->frame.Scr; 8804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber output->height = oldestFrame->frame.height; 8814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber output->pitch = oldestFrame->frame.width; 8824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber output->disp_order = oldestFrame->PicOrderCnt; 8834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber output->coding_order = oldestFrame->FrameNum; 8844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber output->id = (uint32) oldestFrame->base_dpb; /* use the pointer as the id */ 8854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *indx = index; 8864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return AVCDEC_SUCCESS; 8904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 8914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 8934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 8944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Function : PVAVCDecReset() */ 8954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Date : 03/04/2004 */ 8964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Purpose : Reset decoder, prepare it for a new IDR frame. */ 8974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* In/out : */ 8984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Return : void */ 8994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Modified : */ 9004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 9014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF void PVAVCDecReset(AVCHandle *avcHandle) 9024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 9034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecObject *decvid = (AVCDecObject*) avcHandle->AVCObject; 9044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCCommonObj *video; 9054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecPicBuffer *dpb; 9064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int i; 9074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid == NULL) 9094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 9104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return; 9114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 9124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video = decvid->common; 9144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb = video->decPicBuf; 9154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* reset the DPB */ 9174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < dpb->num_fs; i++) 9204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 9214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb->fs[i]->IsLongTerm = 0; 9224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb->fs[i]->IsReference = 0; 9234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb->fs[i]->IsOutputted = 3; 9244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb->fs[i]->frame.isReference = 0; 9254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber dpb->fs[i]->frame.isLongTerm = 0; 9264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 9274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mem_mgr_ctrl_eq_5 = FALSE; 9294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->newPic = TRUE; 9304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->newSlice = TRUE; 9314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currPic = NULL; 9324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->currFS = NULL; 9334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevRefPic = NULL; 9344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevFrameNum = 0; 9354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->PrevRefFrameNum = 0; 9364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->prevFrameNumOffset = 0; 9374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->FrameNumOffset = 0; 9384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbNum = 0; 9394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->numMBs = 0; 9404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return ; 9424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 9434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 9464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Function : PVAVCCleanUpDecoder() */ 9474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Date : 11/4/2003 */ 9484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Purpose : Clean up the decoder, free all memories allocated. */ 9494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* In/out : */ 9504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Return : void */ 9514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Modified : */ 9524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ======================================================================== */ 9534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF void PVAVCCleanUpDecoder(AVCHandle *avcHandle) 9554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 9564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecObject *decvid = (AVCDecObject*) avcHandle->AVCObject; 9574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCCommonObj *video; 9584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber void *userData = avcHandle->userData; 9594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int i; 9604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "PVAVCCleanUpDecoder", -1, -1); 9624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid != NULL) 9644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 9654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video = decvid->common; 9664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video != NULL) 9674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 9684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->MbToSliceGroupMap != NULL) 9694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 9704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)video->MbToSliceGroupMap); 9714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 9724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef MB_BASED_DEBLOCK 9744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->intra_pred_top != NULL) 9754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 9764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)video->intra_pred_top); 9774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 9784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->intra_pred_top_cb != NULL) 9794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 9804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)video->intra_pred_top_cb); 9814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 9824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->intra_pred_top_cr != NULL) 9834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 9844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)video->intra_pred_top_cr); 9854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 9864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif 9874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mblock != NULL) 9884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 9894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)video->mblock); 9904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 9914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->decPicBuf != NULL) 9934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 9944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber CleanUpDPB(avcHandle, video); 9954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)video->decPicBuf); 9964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 9974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 9984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->sliceHdr != NULL) 9994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 10004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)video->sliceHdr); 10014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 10024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 10034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)video); /* last thing to do */ 10044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 10054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 10064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 10074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < 256; i++) 10084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 10094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid->picParams[i] != NULL) 10104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 10114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid->picParams[i]->slice_group_id != NULL) 10124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 10134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)decvid->picParams[i]->slice_group_id); 10144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 10154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)decvid->picParams[i]); 10164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 10174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 10184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < 32; i++) 10194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 10204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid->seqParams[i] != NULL) 10214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 10224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)decvid->seqParams[i]); 10234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 10244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 10254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (decvid->bitstream != NULL) 10264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 10274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)decvid->bitstream); 10284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 10294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 10304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 10314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avcHandle->CBAVC_Free(userData, (int)decvid); 10324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 10334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 10344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 10354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return ; 10364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 1037