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