10c1bc742181ded4930842b46e9507372f0b1b963James Dong/*
20c1bc742181ded4930842b46e9507372f0b1b963James Dong * Copyright (C) 2009 The Android Open Source Project
30c1bc742181ded4930842b46e9507372f0b1b963James Dong *
40c1bc742181ded4930842b46e9507372f0b1b963James Dong * Licensed under the Apache License, Version 2.0 (the "License");
50c1bc742181ded4930842b46e9507372f0b1b963James Dong * you may not use this file except in compliance with the License.
60c1bc742181ded4930842b46e9507372f0b1b963James Dong * You may obtain a copy of the License at
70c1bc742181ded4930842b46e9507372f0b1b963James Dong *
80c1bc742181ded4930842b46e9507372f0b1b963James Dong *      http://www.apache.org/licenses/LICENSE-2.0
90c1bc742181ded4930842b46e9507372f0b1b963James Dong *
100c1bc742181ded4930842b46e9507372f0b1b963James Dong * Unless required by applicable law or agreed to in writing, software
110c1bc742181ded4930842b46e9507372f0b1b963James Dong * distributed under the License is distributed on an "AS IS" BASIS,
120c1bc742181ded4930842b46e9507372f0b1b963James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c1bc742181ded4930842b46e9507372f0b1b963James Dong * See the License for the specific language governing permissions and
140c1bc742181ded4930842b46e9507372f0b1b963James Dong * limitations under the License.
150c1bc742181ded4930842b46e9507372f0b1b963James Dong */
160c1bc742181ded4930842b46e9507372f0b1b963James Dong
170c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
180c1bc742181ded4930842b46e9507372f0b1b963James Dong
190c1bc742181ded4930842b46e9507372f0b1b963James Dong    Table of contents
200c1bc742181ded4930842b46e9507372f0b1b963James Dong
210c1bc742181ded4930842b46e9507372f0b1b963James Dong     1. Include headers
220c1bc742181ded4930842b46e9507372f0b1b963James Dong     2. External compiler flags
230c1bc742181ded4930842b46e9507372f0b1b963James Dong     3. Module defines
240c1bc742181ded4930842b46e9507372f0b1b963James Dong     4. Local function prototypes
250c1bc742181ded4930842b46e9507372f0b1b963James Dong     5. Functions
260c1bc742181ded4930842b46e9507372f0b1b963James Dong          ComparePictures
270c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdReorderRefPicList
280c1bc742181ded4930842b46e9507372f0b1b963James Dong          Mmcop1
290c1bc742181ded4930842b46e9507372f0b1b963James Dong          Mmcop2
300c1bc742181ded4930842b46e9507372f0b1b963James Dong          Mmcop3
310c1bc742181ded4930842b46e9507372f0b1b963James Dong          Mmcop4
320c1bc742181ded4930842b46e9507372f0b1b963James Dong          Mmcop5
330c1bc742181ded4930842b46e9507372f0b1b963James Dong          Mmcop6
340c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdMarkDecRefPic
350c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdGetRefPicData
360c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdAllocateDpbImage
370c1bc742181ded4930842b46e9507372f0b1b963James Dong          SlidingWindowRefPicMarking
380c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdInitDpb
390c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdResetDpb
400c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdInitRefPicList
410c1bc742181ded4930842b46e9507372f0b1b963James Dong          FindDpbPic
420c1bc742181ded4930842b46e9507372f0b1b963James Dong          SetPicNums
430c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdCheckGapsInFrameNum
440c1bc742181ded4930842b46e9507372f0b1b963James Dong          FindSmallestPicOrderCnt
450c1bc742181ded4930842b46e9507372f0b1b963James Dong          OutputPicture
460c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdDpbOutputPicture
470c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdFlushDpb
480c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdFreeDpb
490c1bc742181ded4930842b46e9507372f0b1b963James Dong
500c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
510c1bc742181ded4930842b46e9507372f0b1b963James Dong
520c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
530c1bc742181ded4930842b46e9507372f0b1b963James Dong    1. Include headers
540c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
550c1bc742181ded4930842b46e9507372f0b1b963James Dong
560c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_cfg.h"
570c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_dpb.h"
580c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_slice_header.h"
590c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_image.h"
600c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_util.h"
610c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "basetype.h"
620c1bc742181ded4930842b46e9507372f0b1b963James Dong
63d0090759e79208d7203280166018bb7d5d4f9d02Marco Nelissen#include <log/log.h>
640c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
650c1bc742181ded4930842b46e9507372f0b1b963James Dong    2. External compiler flags
660c1bc742181ded4930842b46e9507372f0b1b963James Dong--------------------------------------------------------------------------------
670c1bc742181ded4930842b46e9507372f0b1b963James Dong
680c1bc742181ded4930842b46e9507372f0b1b963James Dong--------------------------------------------------------------------------------
690c1bc742181ded4930842b46e9507372f0b1b963James Dong    3. Module defines
700c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
710c1bc742181ded4930842b46e9507372f0b1b963James Dong
720c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macros to determine picture status. Note that IS_SHORT_TERM macro returns
730c1bc742181ded4930842b46e9507372f0b1b963James Dong * true also for non-existing pictures because non-existing pictures are
740c1bc742181ded4930842b46e9507372f0b1b963James Dong * regarded short term pictures according to H.264 standard */
750c1bc742181ded4930842b46e9507372f0b1b963James Dong#define IS_REFERENCE(a) ((a).status)
760c1bc742181ded4930842b46e9507372f0b1b963James Dong#define IS_EXISTING(a) ((a).status > NON_EXISTING)
770c1bc742181ded4930842b46e9507372f0b1b963James Dong#define IS_SHORT_TERM(a) \
780c1bc742181ded4930842b46e9507372f0b1b963James Dong    ((a).status == NON_EXISTING || (a).status == SHORT_TERM)
790c1bc742181ded4930842b46e9507372f0b1b963James Dong#define IS_LONG_TERM(a) ((a).status == LONG_TERM)
800c1bc742181ded4930842b46e9507372f0b1b963James Dong
810c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macro to set a picture unused for reference */
820c1bc742181ded4930842b46e9507372f0b1b963James Dong#define SET_UNUSED(a) (a).status = UNUSED;
830c1bc742181ded4930842b46e9507372f0b1b963James Dong
840c1bc742181ded4930842b46e9507372f0b1b963James Dong#define MAX_NUM_REF_IDX_L0_ACTIVE 16
850c1bc742181ded4930842b46e9507372f0b1b963James Dong
860c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
870c1bc742181ded4930842b46e9507372f0b1b963James Dong    4. Local function prototypes
880c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
890c1bc742181ded4930842b46e9507372f0b1b963James Dong
900c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic i32 ComparePictures(const void *ptr1, const void *ptr2);
910c1bc742181ded4930842b46e9507372f0b1b963James Dong
920c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop1(dpbStorage_t *dpb, u32 currPicNum, u32 differenceOfPicNums);
930c1bc742181ded4930842b46e9507372f0b1b963James Dong
940c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop2(dpbStorage_t *dpb, u32 longTermPicNum);
950c1bc742181ded4930842b46e9507372f0b1b963James Dong
960c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop3(dpbStorage_t *dpb, u32 currPicNum, u32 differenceOfPicNums,
970c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 longTermFrameIdx);
980c1bc742181ded4930842b46e9507372f0b1b963James Dong
990c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop4(dpbStorage_t *dpb, u32 maxLongTermFrameIdx);
1000c1bc742181ded4930842b46e9507372f0b1b963James Dong
1010c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop5(dpbStorage_t *dpb);
1020c1bc742181ded4930842b46e9507372f0b1b963James Dong
1030c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop6(dpbStorage_t *dpb, u32 frameNum, i32 picOrderCnt,
1040c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 longTermFrameIdx);
1050c1bc742181ded4930842b46e9507372f0b1b963James Dong
1060c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 SlidingWindowRefPicMarking(dpbStorage_t *dpb);
1070c1bc742181ded4930842b46e9507372f0b1b963James Dong
1080c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic i32 FindDpbPic(dpbStorage_t *dpb, i32 picNum, u32 isShortTerm);
1090c1bc742181ded4930842b46e9507372f0b1b963James Dong
1100c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic void SetPicNums(dpbStorage_t *dpb, u32 currFrameNum);
1110c1bc742181ded4930842b46e9507372f0b1b963James Dong
1120c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic dpbPicture_t* FindSmallestPicOrderCnt(dpbStorage_t *dpb);
1130c1bc742181ded4930842b46e9507372f0b1b963James Dong
1140c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 OutputPicture(dpbStorage_t *dpb);
1150c1bc742181ded4930842b46e9507372f0b1b963James Dong
1160c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic void ShellSort(dpbPicture_t *pPic, u32 num);
1170c1bc742181ded4930842b46e9507372f0b1b963James Dong
1180c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
1190c1bc742181ded4930842b46e9507372f0b1b963James Dong
1200c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: ComparePictures
1210c1bc742181ded4930842b46e9507372f0b1b963James Dong
1220c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
1230c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to compare dpb pictures, used by the ShellSort() function.
1240c1bc742181ded4930842b46e9507372f0b1b963James Dong            Order of the pictures after sorting shall be as follows:
1250c1bc742181ded4930842b46e9507372f0b1b963James Dong                1) short term reference pictures starting with the largest
1260c1bc742181ded4930842b46e9507372f0b1b963James Dong                   picNum
1270c1bc742181ded4930842b46e9507372f0b1b963James Dong                2) long term reference pictures starting with the smallest
1280c1bc742181ded4930842b46e9507372f0b1b963James Dong                   longTermPicNum
1290c1bc742181ded4930842b46e9507372f0b1b963James Dong                3) pictures unused for reference but needed for display
1300c1bc742181ded4930842b46e9507372f0b1b963James Dong                4) other pictures
1310c1bc742181ded4930842b46e9507372f0b1b963James Dong
1320c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
1330c1bc742181ded4930842b46e9507372f0b1b963James Dong            -1      pic 1 is greater than pic 2
1340c1bc742181ded4930842b46e9507372f0b1b963James Dong             0      equal from comparison point of view
1350c1bc742181ded4930842b46e9507372f0b1b963James Dong             1      pic 2 is greater then pic 1
1360c1bc742181ded4930842b46e9507372f0b1b963James Dong
1370c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
1380c1bc742181ded4930842b46e9507372f0b1b963James Dong
1390c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic i32 ComparePictures(const void *ptr1, const void *ptr2)
1400c1bc742181ded4930842b46e9507372f0b1b963James Dong{
1410c1bc742181ded4930842b46e9507372f0b1b963James Dong
1420c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
1430c1bc742181ded4930842b46e9507372f0b1b963James Dong
1440c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpbPicture_t *pic1, *pic2;
1450c1bc742181ded4930842b46e9507372f0b1b963James Dong
1460c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
1470c1bc742181ded4930842b46e9507372f0b1b963James Dong
1480c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(ptr1);
1490c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(ptr2);
1500c1bc742181ded4930842b46e9507372f0b1b963James Dong
1510c1bc742181ded4930842b46e9507372f0b1b963James Dong    pic1 = (dpbPicture_t*)ptr1;
1520c1bc742181ded4930842b46e9507372f0b1b963James Dong    pic2 = (dpbPicture_t*)ptr2;
1530c1bc742181ded4930842b46e9507372f0b1b963James Dong
1540c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* both are non-reference pictures, check if needed for display */
1550c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (!IS_REFERENCE(*pic1) && !IS_REFERENCE(*pic2))
1560c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
1570c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (pic1->toBeDisplayed && !pic2->toBeDisplayed)
1580c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(-1);
1590c1bc742181ded4930842b46e9507372f0b1b963James Dong        else if (!pic1->toBeDisplayed && pic2->toBeDisplayed)
1600c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(1);
1610c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
1620c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(0);
1630c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
1640c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* only pic 1 needed for reference -> greater */
1650c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (!IS_REFERENCE(*pic2))
1660c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(-1);
1670c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* only pic 2 needed for reference -> greater */
1680c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (!IS_REFERENCE(*pic1))
1690c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(1);
1700c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* both are short term reference pictures -> check picNum */
1710c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (IS_SHORT_TERM(*pic1) && IS_SHORT_TERM(*pic2))
1720c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
1730c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (pic1->picNum > pic2->picNum)
1740c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(-1);
1750c1bc742181ded4930842b46e9507372f0b1b963James Dong        else if (pic1->picNum < pic2->picNum)
1760c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(1);
1770c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
1780c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(0);
1790c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
1800c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* only pic 1 is short term -> greater */
1810c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (IS_SHORT_TERM(*pic1))
1820c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(-1);
1830c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* only pic 2 is short term -> greater */
1840c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (IS_SHORT_TERM(*pic2))
1850c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(1);
1860c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* both are long term reference pictures -> check picNum (contains the
1870c1bc742181ded4930842b46e9507372f0b1b963James Dong     * longTermPicNum */
1880c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
1890c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
1900c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (pic1->picNum > pic2->picNum)
1910c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(1);
1920c1bc742181ded4930842b46e9507372f0b1b963James Dong        else if (pic1->picNum < pic2->picNum)
1930c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(-1);
1940c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
1950c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(0);
1960c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
1970c1bc742181ded4930842b46e9507372f0b1b963James Dong}
1980c1bc742181ded4930842b46e9507372f0b1b963James Dong
1990c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
2000c1bc742181ded4930842b46e9507372f0b1b963James Dong
2010c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdReorderRefPicList
2020c1bc742181ded4930842b46e9507372f0b1b963James Dong
2030c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
2040c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to perform reference picture list reordering based on
2050c1bc742181ded4930842b46e9507372f0b1b963James Dong            reordering commands received in the slice header. See details
2060c1bc742181ded4930842b46e9507372f0b1b963James Dong            of the process in the H.264 standard.
2070c1bc742181ded4930842b46e9507372f0b1b963James Dong
2080c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
2090c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb             pointer to dpb storage structure
2100c1bc742181ded4930842b46e9507372f0b1b963James Dong            order           pointer to reordering commands
2110c1bc742181ded4930842b46e9507372f0b1b963James Dong            currFrameNum    current frame number
2120c1bc742181ded4930842b46e9507372f0b1b963James Dong            numRefIdxActive number of active reference indices for current
2130c1bc742181ded4930842b46e9507372f0b1b963James Dong                            picture
2140c1bc742181ded4930842b46e9507372f0b1b963James Dong
2150c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
2160c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb             'list' field of the structure reordered
2170c1bc742181ded4930842b46e9507372f0b1b963James Dong
2180c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
2190c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK      success
2200c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_NOK     if non-existing pictures referred to in the
2210c1bc742181ded4930842b46e9507372f0b1b963James Dong                           reordering commands
2220c1bc742181ded4930842b46e9507372f0b1b963James Dong
2230c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
2240c1bc742181ded4930842b46e9507372f0b1b963James Dong
2250c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdReorderRefPicList(
2260c1bc742181ded4930842b46e9507372f0b1b963James Dong  dpbStorage_t *dpb,
2270c1bc742181ded4930842b46e9507372f0b1b963James Dong  refPicListReordering_t *order,
2280c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 currFrameNum,
2290c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 numRefIdxActive)
2300c1bc742181ded4930842b46e9507372f0b1b963James Dong{
2310c1bc742181ded4930842b46e9507372f0b1b963James Dong
2320c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
2330c1bc742181ded4930842b46e9507372f0b1b963James Dong
2340c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i, j, k, picNumPred, refIdx;
2350c1bc742181ded4930842b46e9507372f0b1b963James Dong    i32 picNum, picNumNoWrap, index;
2360c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 isShortTerm;
2370c1bc742181ded4930842b46e9507372f0b1b963James Dong
2380c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
2390c1bc742181ded4930842b46e9507372f0b1b963James Dong
2400c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(order);
2410c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(currFrameNum <= dpb->maxFrameNum);
2420c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(numRefIdxActive <= MAX_NUM_REF_IDX_L0_ACTIVE);
2430c1bc742181ded4930842b46e9507372f0b1b963James Dong
2440c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* set dpb picture numbers for sorting */
2450c1bc742181ded4930842b46e9507372f0b1b963James Dong    SetPicNums(dpb, currFrameNum);
2460c1bc742181ded4930842b46e9507372f0b1b963James Dong
2470c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (!order->refPicListReorderingFlagL0)
2480c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_OK);
2490c1bc742181ded4930842b46e9507372f0b1b963James Dong
2500c1bc742181ded4930842b46e9507372f0b1b963James Dong    refIdx     = 0;
2510c1bc742181ded4930842b46e9507372f0b1b963James Dong    picNumPred = currFrameNum;
2520c1bc742181ded4930842b46e9507372f0b1b963James Dong
2530c1bc742181ded4930842b46e9507372f0b1b963James Dong    i = 0;
2540c1bc742181ded4930842b46e9507372f0b1b963James Dong    while (order->command[i].reorderingOfPicNumsIdc < 3)
2550c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
2560c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* short term */
2570c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (order->command[i].reorderingOfPicNumsIdc < 2)
2580c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
2590c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (order->command[i].reorderingOfPicNumsIdc == 0)
2600c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
2610c1bc742181ded4930842b46e9507372f0b1b963James Dong                picNumNoWrap =
2620c1bc742181ded4930842b46e9507372f0b1b963James Dong                    (i32)picNumPred - (i32)order->command[i].absDiffPicNum;
2630c1bc742181ded4930842b46e9507372f0b1b963James Dong                if (picNumNoWrap < 0)
2640c1bc742181ded4930842b46e9507372f0b1b963James Dong                    picNumNoWrap += (i32)dpb->maxFrameNum;
2650c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
2660c1bc742181ded4930842b46e9507372f0b1b963James Dong            else
2670c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
2680c1bc742181ded4930842b46e9507372f0b1b963James Dong                picNumNoWrap =
2690c1bc742181ded4930842b46e9507372f0b1b963James Dong                    (i32)(picNumPred + order->command[i].absDiffPicNum);
2700c1bc742181ded4930842b46e9507372f0b1b963James Dong                if (picNumNoWrap >= (i32)dpb->maxFrameNum)
2710c1bc742181ded4930842b46e9507372f0b1b963James Dong                    picNumNoWrap -= (i32)dpb->maxFrameNum;
2720c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
2730c1bc742181ded4930842b46e9507372f0b1b963James Dong            picNumPred = (u32)picNumNoWrap;
2740c1bc742181ded4930842b46e9507372f0b1b963James Dong            picNum = picNumNoWrap;
2750c1bc742181ded4930842b46e9507372f0b1b963James Dong            if ((u32)picNumNoWrap > currFrameNum)
2760c1bc742181ded4930842b46e9507372f0b1b963James Dong                picNum -= (i32)dpb->maxFrameNum;
2770c1bc742181ded4930842b46e9507372f0b1b963James Dong            isShortTerm = HANTRO_TRUE;
2780c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
2790c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* long term */
2800c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
2810c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
2820c1bc742181ded4930842b46e9507372f0b1b963James Dong            picNum = (i32)order->command[i].longTermPicNum;
2830c1bc742181ded4930842b46e9507372f0b1b963James Dong            isShortTerm = HANTRO_FALSE;
2840c1bc742181ded4930842b46e9507372f0b1b963James Dong
2850c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
2860c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* find corresponding picture from dpb */
2870c1bc742181ded4930842b46e9507372f0b1b963James Dong        index = FindDpbPic(dpb, picNum, isShortTerm);
2880c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (index < 0 || !IS_EXISTING(dpb->buffer[index]))
2890c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(HANTRO_NOK);
2900c1bc742181ded4930842b46e9507372f0b1b963James Dong
2910c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* shift pictures */
2920c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (j = numRefIdxActive; j > refIdx; j--)
2930c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->list[j] = dpb->list[j-1];
2940c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* put picture into the list */
2950c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->list[refIdx++] = &dpb->buffer[index];
2960c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* remove later references to the same picture */
2970c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (j = k = refIdx; j <= numRefIdxActive; j++)
2980c1bc742181ded4930842b46e9507372f0b1b963James Dong            if(dpb->list[j] != &dpb->buffer[index])
2990c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->list[k++] = dpb->list[j];
3000c1bc742181ded4930842b46e9507372f0b1b963James Dong
3010c1bc742181ded4930842b46e9507372f0b1b963James Dong        i++;
3020c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
3030c1bc742181ded4930842b46e9507372f0b1b963James Dong
3040c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(HANTRO_OK);
3050c1bc742181ded4930842b46e9507372f0b1b963James Dong
3060c1bc742181ded4930842b46e9507372f0b1b963James Dong}
3070c1bc742181ded4930842b46e9507372f0b1b963James Dong
3080c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
3090c1bc742181ded4930842b46e9507372f0b1b963James Dong
3100c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: Mmcop1
3110c1bc742181ded4930842b46e9507372f0b1b963James Dong
3120c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
3130c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to mark a short-term reference picture unused for
3140c1bc742181ded4930842b46e9507372f0b1b963James Dong            reference, memory_management_control_operation equal to 1
3150c1bc742181ded4930842b46e9507372f0b1b963James Dong
3160c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
3170c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK      success
3180c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_NOK     failure, picture does not exist in the buffer
3190c1bc742181ded4930842b46e9507372f0b1b963James Dong
3200c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
3210c1bc742181ded4930842b46e9507372f0b1b963James Dong
3220c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop1(dpbStorage_t *dpb, u32 currPicNum, u32 differenceOfPicNums)
3230c1bc742181ded4930842b46e9507372f0b1b963James Dong{
3240c1bc742181ded4930842b46e9507372f0b1b963James Dong
3250c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
3260c1bc742181ded4930842b46e9507372f0b1b963James Dong
3270c1bc742181ded4930842b46e9507372f0b1b963James Dong    i32 index, picNum;
3280c1bc742181ded4930842b46e9507372f0b1b963James Dong
3290c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
3300c1bc742181ded4930842b46e9507372f0b1b963James Dong
3310c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(currPicNum < dpb->maxFrameNum);
3320c1bc742181ded4930842b46e9507372f0b1b963James Dong
3330c1bc742181ded4930842b46e9507372f0b1b963James Dong    picNum = (i32)currPicNum - (i32)differenceOfPicNums;
3340c1bc742181ded4930842b46e9507372f0b1b963James Dong
3350c1bc742181ded4930842b46e9507372f0b1b963James Dong    index = FindDpbPic(dpb, picNum, HANTRO_TRUE);
3360c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (index < 0)
3370c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
3380c1bc742181ded4930842b46e9507372f0b1b963James Dong
3390c1bc742181ded4930842b46e9507372f0b1b963James Dong    SET_UNUSED(dpb->buffer[index]);
3400c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->numRefFrames--;
3410c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (!dpb->buffer[index].toBeDisplayed)
3420c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->fullness--;
3430c1bc742181ded4930842b46e9507372f0b1b963James Dong
3440c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(HANTRO_OK);
3450c1bc742181ded4930842b46e9507372f0b1b963James Dong
3460c1bc742181ded4930842b46e9507372f0b1b963James Dong}
3470c1bc742181ded4930842b46e9507372f0b1b963James Dong
3480c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
3490c1bc742181ded4930842b46e9507372f0b1b963James Dong
3500c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: Mmcop2
3510c1bc742181ded4930842b46e9507372f0b1b963James Dong
3520c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
3530c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to mark a long-term reference picture unused for
3540c1bc742181ded4930842b46e9507372f0b1b963James Dong            reference, memory_management_control_operation equal to 2
3550c1bc742181ded4930842b46e9507372f0b1b963James Dong
3560c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
3570c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK      success
3580c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_NOK     failure, picture does not exist in the buffer
3590c1bc742181ded4930842b46e9507372f0b1b963James Dong
3600c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
3610c1bc742181ded4930842b46e9507372f0b1b963James Dong
3620c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop2(dpbStorage_t *dpb, u32 longTermPicNum)
3630c1bc742181ded4930842b46e9507372f0b1b963James Dong{
3640c1bc742181ded4930842b46e9507372f0b1b963James Dong
3650c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
3660c1bc742181ded4930842b46e9507372f0b1b963James Dong
3670c1bc742181ded4930842b46e9507372f0b1b963James Dong    i32 index;
3680c1bc742181ded4930842b46e9507372f0b1b963James Dong
3690c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
3700c1bc742181ded4930842b46e9507372f0b1b963James Dong
3710c1bc742181ded4930842b46e9507372f0b1b963James Dong    index = FindDpbPic(dpb, (i32)longTermPicNum, HANTRO_FALSE);
3720c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (index < 0)
3730c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
3740c1bc742181ded4930842b46e9507372f0b1b963James Dong
3750c1bc742181ded4930842b46e9507372f0b1b963James Dong    SET_UNUSED(dpb->buffer[index]);
3760c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->numRefFrames--;
3770c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (!dpb->buffer[index].toBeDisplayed)
3780c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->fullness--;
3790c1bc742181ded4930842b46e9507372f0b1b963James Dong
3800c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(HANTRO_OK);
3810c1bc742181ded4930842b46e9507372f0b1b963James Dong
3820c1bc742181ded4930842b46e9507372f0b1b963James Dong}
3830c1bc742181ded4930842b46e9507372f0b1b963James Dong
3840c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
3850c1bc742181ded4930842b46e9507372f0b1b963James Dong
3860c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: Mmcop3
3870c1bc742181ded4930842b46e9507372f0b1b963James Dong
3880c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
3890c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to assing a longTermFrameIdx to a short-term reference
3900c1bc742181ded4930842b46e9507372f0b1b963James Dong            frame (i.e. to change it to a long-term reference picture),
3910c1bc742181ded4930842b46e9507372f0b1b963James Dong            memory_management_control_operation equal to 3
3920c1bc742181ded4930842b46e9507372f0b1b963James Dong
3930c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
3940c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK      success
3950c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_NOK     failure, short-term picture does not exist in the
3960c1bc742181ded4930842b46e9507372f0b1b963James Dong                           buffer or is a non-existing picture, or invalid
3970c1bc742181ded4930842b46e9507372f0b1b963James Dong                           longTermFrameIdx given
3980c1bc742181ded4930842b46e9507372f0b1b963James Dong
3990c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
4000c1bc742181ded4930842b46e9507372f0b1b963James Dong
4010c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop3(dpbStorage_t *dpb, u32 currPicNum, u32 differenceOfPicNums,
4020c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 longTermFrameIdx)
4030c1bc742181ded4930842b46e9507372f0b1b963James Dong{
4040c1bc742181ded4930842b46e9507372f0b1b963James Dong
4050c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
4060c1bc742181ded4930842b46e9507372f0b1b963James Dong
4070c1bc742181ded4930842b46e9507372f0b1b963James Dong    i32 index, picNum;
4080c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i;
4090c1bc742181ded4930842b46e9507372f0b1b963James Dong
4100c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
4110c1bc742181ded4930842b46e9507372f0b1b963James Dong
4120c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpb);
4130c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(currPicNum < dpb->maxFrameNum);
4140c1bc742181ded4930842b46e9507372f0b1b963James Dong
4150c1bc742181ded4930842b46e9507372f0b1b963James Dong    if ( (dpb->maxLongTermFrameIdx == NO_LONG_TERM_FRAME_INDICES) ||
4160c1bc742181ded4930842b46e9507372f0b1b963James Dong         (longTermFrameIdx > dpb->maxLongTermFrameIdx) )
4170c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
4180c1bc742181ded4930842b46e9507372f0b1b963James Dong
4190c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* check if a long term picture with the same longTermFrameIdx already
4200c1bc742181ded4930842b46e9507372f0b1b963James Dong     * exist and remove it if necessary */
4210c1bc742181ded4930842b46e9507372f0b1b963James Dong    for (i = 0; i < dpb->maxRefFrames; i++)
4220c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (IS_LONG_TERM(dpb->buffer[i]) &&
4230c1bc742181ded4930842b46e9507372f0b1b963James Dong          (u32)dpb->buffer[i].picNum == longTermFrameIdx)
4240c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
4250c1bc742181ded4930842b46e9507372f0b1b963James Dong            SET_UNUSED(dpb->buffer[i]);
4260c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->numRefFrames--;
4270c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (!dpb->buffer[i].toBeDisplayed)
4280c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->fullness--;
4290c1bc742181ded4930842b46e9507372f0b1b963James Dong            break;
4300c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
4310c1bc742181ded4930842b46e9507372f0b1b963James Dong
4320c1bc742181ded4930842b46e9507372f0b1b963James Dong    picNum = (i32)currPicNum - (i32)differenceOfPicNums;
4330c1bc742181ded4930842b46e9507372f0b1b963James Dong
4340c1bc742181ded4930842b46e9507372f0b1b963James Dong    index = FindDpbPic(dpb, picNum, HANTRO_TRUE);
4350c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (index < 0)
4360c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
4370c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (!IS_EXISTING(dpb->buffer[index]))
4380c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
4390c1bc742181ded4930842b46e9507372f0b1b963James Dong
4400c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->buffer[index].status = LONG_TERM;
4410c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->buffer[index].picNum = (i32)longTermFrameIdx;
4420c1bc742181ded4930842b46e9507372f0b1b963James Dong
4430c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(HANTRO_OK);
4440c1bc742181ded4930842b46e9507372f0b1b963James Dong
4450c1bc742181ded4930842b46e9507372f0b1b963James Dong}
4460c1bc742181ded4930842b46e9507372f0b1b963James Dong
4470c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
4480c1bc742181ded4930842b46e9507372f0b1b963James Dong
4490c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: Mmcop4
4500c1bc742181ded4930842b46e9507372f0b1b963James Dong
4510c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
4520c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to set maxLongTermFrameIdx,
4530c1bc742181ded4930842b46e9507372f0b1b963James Dong            memory_management_control_operation equal to 4
4540c1bc742181ded4930842b46e9507372f0b1b963James Dong
4550c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
4560c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK      success
4570c1bc742181ded4930842b46e9507372f0b1b963James Dong
4580c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
4590c1bc742181ded4930842b46e9507372f0b1b963James Dong
4600c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop4(dpbStorage_t *dpb, u32 maxLongTermFrameIdx)
4610c1bc742181ded4930842b46e9507372f0b1b963James Dong{
4620c1bc742181ded4930842b46e9507372f0b1b963James Dong
4630c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
4640c1bc742181ded4930842b46e9507372f0b1b963James Dong
4650c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i;
4660c1bc742181ded4930842b46e9507372f0b1b963James Dong
4670c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
4680c1bc742181ded4930842b46e9507372f0b1b963James Dong
4690c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->maxLongTermFrameIdx = maxLongTermFrameIdx;
4700c1bc742181ded4930842b46e9507372f0b1b963James Dong
4710c1bc742181ded4930842b46e9507372f0b1b963James Dong    for (i = 0; i < dpb->maxRefFrames; i++)
4720c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (IS_LONG_TERM(dpb->buffer[i]) &&
4730c1bc742181ded4930842b46e9507372f0b1b963James Dong          ( ((u32)dpb->buffer[i].picNum > maxLongTermFrameIdx) ||
4740c1bc742181ded4930842b46e9507372f0b1b963James Dong            (dpb->maxLongTermFrameIdx == NO_LONG_TERM_FRAME_INDICES) ) )
4750c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
4760c1bc742181ded4930842b46e9507372f0b1b963James Dong            SET_UNUSED(dpb->buffer[i]);
4770c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->numRefFrames--;
4780c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (!dpb->buffer[i].toBeDisplayed)
4790c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->fullness--;
4800c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
4810c1bc742181ded4930842b46e9507372f0b1b963James Dong
4820c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(HANTRO_OK);
4830c1bc742181ded4930842b46e9507372f0b1b963James Dong
4840c1bc742181ded4930842b46e9507372f0b1b963James Dong}
4850c1bc742181ded4930842b46e9507372f0b1b963James Dong
4860c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
4870c1bc742181ded4930842b46e9507372f0b1b963James Dong
4880c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: Mmcop5
4890c1bc742181ded4930842b46e9507372f0b1b963James Dong
4900c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
4910c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to mark all reference pictures unused for reference and
4920c1bc742181ded4930842b46e9507372f0b1b963James Dong            set maxLongTermFrameIdx to NO_LONG_TERM_FRAME_INDICES,
4930c1bc742181ded4930842b46e9507372f0b1b963James Dong            memory_management_control_operation equal to 5. Function flushes
4940c1bc742181ded4930842b46e9507372f0b1b963James Dong            the buffer and places all pictures that are needed for display into
4950c1bc742181ded4930842b46e9507372f0b1b963James Dong            the output buffer.
4960c1bc742181ded4930842b46e9507372f0b1b963James Dong
4970c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
4980c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK      success
4990c1bc742181ded4930842b46e9507372f0b1b963James Dong
5000c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
5010c1bc742181ded4930842b46e9507372f0b1b963James Dong
5020c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop5(dpbStorage_t *dpb)
5030c1bc742181ded4930842b46e9507372f0b1b963James Dong{
5040c1bc742181ded4930842b46e9507372f0b1b963James Dong
5050c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
5060c1bc742181ded4930842b46e9507372f0b1b963James Dong
5070c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i;
5080c1bc742181ded4930842b46e9507372f0b1b963James Dong
5090c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
5100c1bc742181ded4930842b46e9507372f0b1b963James Dong
5110c1bc742181ded4930842b46e9507372f0b1b963James Dong    for (i = 0; i < 16; i++)
5120c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
5130c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (IS_REFERENCE(dpb->buffer[i]))
5140c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
5150c1bc742181ded4930842b46e9507372f0b1b963James Dong            SET_UNUSED(dpb->buffer[i]);
5160c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (!dpb->buffer[i].toBeDisplayed)
5170c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->fullness--;
5180c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
5190c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
5200c1bc742181ded4930842b46e9507372f0b1b963James Dong
5210c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* output all pictures */
5220c1bc742181ded4930842b46e9507372f0b1b963James Dong    while (OutputPicture(dpb) == HANTRO_OK)
5230c1bc742181ded4930842b46e9507372f0b1b963James Dong        ;
5240c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->numRefFrames = 0;
5250c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->maxLongTermFrameIdx = NO_LONG_TERM_FRAME_INDICES;
5260c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->prevRefFrameNum = 0;
5270c1bc742181ded4930842b46e9507372f0b1b963James Dong
5280c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(HANTRO_OK);
5290c1bc742181ded4930842b46e9507372f0b1b963James Dong
5300c1bc742181ded4930842b46e9507372f0b1b963James Dong}
5310c1bc742181ded4930842b46e9507372f0b1b963James Dong
5320c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
5330c1bc742181ded4930842b46e9507372f0b1b963James Dong
5340c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: Mmcop6
5350c1bc742181ded4930842b46e9507372f0b1b963James Dong
5360c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
5370c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to assign longTermFrameIdx to the current picture,
5380c1bc742181ded4930842b46e9507372f0b1b963James Dong            memory_management_control_operation equal to 6
5390c1bc742181ded4930842b46e9507372f0b1b963James Dong
5400c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
5410c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK      success
5420c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_NOK     invalid longTermFrameIdx or no room for current
5430c1bc742181ded4930842b46e9507372f0b1b963James Dong                           picture in the buffer
5440c1bc742181ded4930842b46e9507372f0b1b963James Dong
5450c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
5460c1bc742181ded4930842b46e9507372f0b1b963James Dong
5470c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 Mmcop6(dpbStorage_t *dpb, u32 frameNum, i32 picOrderCnt,
5480c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 longTermFrameIdx)
5490c1bc742181ded4930842b46e9507372f0b1b963James Dong{
5500c1bc742181ded4930842b46e9507372f0b1b963James Dong
5510c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
5520c1bc742181ded4930842b46e9507372f0b1b963James Dong
5530c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i;
5540c1bc742181ded4930842b46e9507372f0b1b963James Dong
5550c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
5560c1bc742181ded4930842b46e9507372f0b1b963James Dong
5570c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(frameNum < dpb->maxFrameNum);
5580c1bc742181ded4930842b46e9507372f0b1b963James Dong
5590c1bc742181ded4930842b46e9507372f0b1b963James Dong    if ( (dpb->maxLongTermFrameIdx == NO_LONG_TERM_FRAME_INDICES) ||
5600c1bc742181ded4930842b46e9507372f0b1b963James Dong         (longTermFrameIdx > dpb->maxLongTermFrameIdx) )
5610c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
5620c1bc742181ded4930842b46e9507372f0b1b963James Dong
5630c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* check if a long term picture with the same longTermFrameIdx already
5640c1bc742181ded4930842b46e9507372f0b1b963James Dong     * exist and remove it if necessary */
5650c1bc742181ded4930842b46e9507372f0b1b963James Dong    for (i = 0; i < dpb->maxRefFrames; i++)
5660c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (IS_LONG_TERM(dpb->buffer[i]) &&
5670c1bc742181ded4930842b46e9507372f0b1b963James Dong          (u32)dpb->buffer[i].picNum == longTermFrameIdx)
5680c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
5690c1bc742181ded4930842b46e9507372f0b1b963James Dong            SET_UNUSED(dpb->buffer[i]);
5700c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->numRefFrames--;
5710c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (!dpb->buffer[i].toBeDisplayed)
5720c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->fullness--;
5730c1bc742181ded4930842b46e9507372f0b1b963James Dong            break;
5740c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
5750c1bc742181ded4930842b46e9507372f0b1b963James Dong
5760c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (dpb->numRefFrames < dpb->maxRefFrames)
5770c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
5780c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->frameNum = frameNum;
5790c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->picNum   = (i32)longTermFrameIdx;
5800c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->picOrderCnt = picOrderCnt;
5810c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->status   = LONG_TERM;
5820c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (dpb->noReordering)
5830c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->currentOut->toBeDisplayed = HANTRO_FALSE;
5840c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
5850c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->currentOut->toBeDisplayed = HANTRO_TRUE;
5860c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->numRefFrames++;
5870c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->fullness++;
5880c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_OK);
5890c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
5900c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* if there is no room, return an error */
5910c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
5920c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
5930c1bc742181ded4930842b46e9507372f0b1b963James Dong
5940c1bc742181ded4930842b46e9507372f0b1b963James Dong}
5950c1bc742181ded4930842b46e9507372f0b1b963James Dong
5960c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
5970c1bc742181ded4930842b46e9507372f0b1b963James Dong
5980c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdMarkDecRefPic
5990c1bc742181ded4930842b46e9507372f0b1b963James Dong
6000c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
6010c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to perform reference picture marking process. This
6020c1bc742181ded4930842b46e9507372f0b1b963James Dong            function should be called both for reference and non-reference
6030c1bc742181ded4930842b46e9507372f0b1b963James Dong            pictures.  Non-reference pictures shall have mark pointer set to
6040c1bc742181ded4930842b46e9507372f0b1b963James Dong            NULL.
6050c1bc742181ded4930842b46e9507372f0b1b963James Dong
6060c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
6070c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb         pointer to the DPB data structure
6080c1bc742181ded4930842b46e9507372f0b1b963James Dong            mark        pointer to reference picture marking commands
6090c1bc742181ded4930842b46e9507372f0b1b963James Dong            image       pointer to current picture to be placed in the buffer
6100c1bc742181ded4930842b46e9507372f0b1b963James Dong            frameNum    frame number of the current picture
6110c1bc742181ded4930842b46e9507372f0b1b963James Dong            picOrderCnt picture order count for the current picture
6120c1bc742181ded4930842b46e9507372f0b1b963James Dong            isIdr       flag to indicate if the current picture is an
6130c1bc742181ded4930842b46e9507372f0b1b963James Dong                        IDR picture
6140c1bc742181ded4930842b46e9507372f0b1b963James Dong            currentPicId    identifier for the current picture, from the
6150c1bc742181ded4930842b46e9507372f0b1b963James Dong                            application, stored along with the picture
6160c1bc742181ded4930842b46e9507372f0b1b963James Dong            numErrMbs       number of concealed macroblocks in the current
6170c1bc742181ded4930842b46e9507372f0b1b963James Dong                            picture, stored along with the picture
6180c1bc742181ded4930842b46e9507372f0b1b963James Dong
6190c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
6200c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb         'buffer' modified, possible output frames placed into
6210c1bc742181ded4930842b46e9507372f0b1b963James Dong                        'outBuf'
6220c1bc742181ded4930842b46e9507372f0b1b963James Dong
6230c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
6240c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK   success
6250c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_NOK  failure
6260c1bc742181ded4930842b46e9507372f0b1b963James Dong
6270c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
6280c1bc742181ded4930842b46e9507372f0b1b963James Dong
6290c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdMarkDecRefPic(
6300c1bc742181ded4930842b46e9507372f0b1b963James Dong  dpbStorage_t *dpb,
6310c1bc742181ded4930842b46e9507372f0b1b963James Dong  decRefPicMarking_t *mark,
6320c1bc742181ded4930842b46e9507372f0b1b963James Dong  image_t *image,
6330c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 frameNum,
6340c1bc742181ded4930842b46e9507372f0b1b963James Dong  i32 picOrderCnt,
6350c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 isIdr,
6360c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 currentPicId,
6370c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 numErrMbs)
6380c1bc742181ded4930842b46e9507372f0b1b963James Dong{
6390c1bc742181ded4930842b46e9507372f0b1b963James Dong
6400c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
6410c1bc742181ded4930842b46e9507372f0b1b963James Dong
6420c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i, status;
6430c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 markedAsLongTerm;
6440c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 toBeDisplayed;
6450c1bc742181ded4930842b46e9507372f0b1b963James Dong
6460c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
6470c1bc742181ded4930842b46e9507372f0b1b963James Dong
6480c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpb);
6490c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(mark || !isIdr);
6500c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(!isIdr || (frameNum == 0 && picOrderCnt == 0));
6510c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(frameNum < dpb->maxFrameNum);
6520c1bc742181ded4930842b46e9507372f0b1b963James Dong
6530c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (image->data != dpb->currentOut->data)
6540c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
6550c1bc742181ded4930842b46e9507372f0b1b963James Dong        EPRINT("TRYING TO MARK NON-ALLOCATED IMAGE");
6560c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
6570c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
6580c1bc742181ded4930842b46e9507372f0b1b963James Dong
6590c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->lastContainsMmco5 = HANTRO_FALSE;
6600c1bc742181ded4930842b46e9507372f0b1b963James Dong    status = HANTRO_OK;
6610c1bc742181ded4930842b46e9507372f0b1b963James Dong
6620c1bc742181ded4930842b46e9507372f0b1b963James Dong    toBeDisplayed = dpb->noReordering ? HANTRO_FALSE : HANTRO_TRUE;
6630c1bc742181ded4930842b46e9507372f0b1b963James Dong
6640c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* non-reference picture, stored for display reordering purposes */
6650c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (mark == NULL)
6660c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
6670c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->status = UNUSED;
6680c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->frameNum = frameNum;
6690c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->picNum = (i32)frameNum;
6700c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->picOrderCnt = picOrderCnt;
6710c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->toBeDisplayed = toBeDisplayed;
6720c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (!dpb->noReordering)
6730c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->fullness++;
6740c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
6750c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* IDR picture */
6760c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (isIdr)
6770c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
6780c1bc742181ded4930842b46e9507372f0b1b963James Dong
6790c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* h264bsdCheckGapsInFrameNum not called for IDR pictures -> have to
6800c1bc742181ded4930842b46e9507372f0b1b963James Dong         * reset numOut and outIndex here */
6810c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->numOut = dpb->outIndex = 0;
6820c1bc742181ded4930842b46e9507372f0b1b963James Dong
6830c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* flush the buffer */
6840c1bc742181ded4930842b46e9507372f0b1b963James Dong        Mmcop5(dpb);
6850c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* if noOutputOfPriorPicsFlag was set -> the pictures preceding the
6860c1bc742181ded4930842b46e9507372f0b1b963James Dong         * IDR picture shall not be output -> set output buffer empty */
6870c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (mark->noOutputOfPriorPicsFlag || dpb->noReordering)
6880c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
6890c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->numOut = 0;
6900c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->outIndex = 0;
6910c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
6920c1bc742181ded4930842b46e9507372f0b1b963James Dong
6930c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (mark->longTermReferenceFlag)
6940c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
6950c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->currentOut->status = LONG_TERM;
6960c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->maxLongTermFrameIdx = 0;
6970c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
6980c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
6990c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
7000c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->currentOut->status = SHORT_TERM;
7010c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->maxLongTermFrameIdx = NO_LONG_TERM_FRAME_INDICES;
7020c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
7030c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->frameNum  = 0;
7040c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->picNum    = 0;
7050c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->picOrderCnt = 0;
7060c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->currentOut->toBeDisplayed = toBeDisplayed;
7070c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->fullness = 1;
7080c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->numRefFrames = 1;
7090c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
7100c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* reference picture */
7110c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
7120c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
7130c1bc742181ded4930842b46e9507372f0b1b963James Dong        markedAsLongTerm = HANTRO_FALSE;
7140c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (mark->adaptiveRefPicMarkingModeFlag)
7150c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
7160c1bc742181ded4930842b46e9507372f0b1b963James Dong            i = 0;
7170c1bc742181ded4930842b46e9507372f0b1b963James Dong            while (mark->operation[i].memoryManagementControlOperation)
7180c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
7190c1bc742181ded4930842b46e9507372f0b1b963James Dong                switch (mark->operation[i].memoryManagementControlOperation)
7200c1bc742181ded4930842b46e9507372f0b1b963James Dong                {
7210c1bc742181ded4930842b46e9507372f0b1b963James Dong                    case 1:
7220c1bc742181ded4930842b46e9507372f0b1b963James Dong                        status = Mmcop1(
7230c1bc742181ded4930842b46e9507372f0b1b963James Dong                          dpb,
7240c1bc742181ded4930842b46e9507372f0b1b963James Dong                          frameNum,
7250c1bc742181ded4930842b46e9507372f0b1b963James Dong                          mark->operation[i].differenceOfPicNums);
7260c1bc742181ded4930842b46e9507372f0b1b963James Dong                        break;
7270c1bc742181ded4930842b46e9507372f0b1b963James Dong
7280c1bc742181ded4930842b46e9507372f0b1b963James Dong                    case 2:
7290c1bc742181ded4930842b46e9507372f0b1b963James Dong                        status = Mmcop2(dpb, mark->operation[i].longTermPicNum);
7300c1bc742181ded4930842b46e9507372f0b1b963James Dong                        break;
7310c1bc742181ded4930842b46e9507372f0b1b963James Dong
7320c1bc742181ded4930842b46e9507372f0b1b963James Dong                    case 3:
7330c1bc742181ded4930842b46e9507372f0b1b963James Dong                        status =  Mmcop3(
7340c1bc742181ded4930842b46e9507372f0b1b963James Dong                          dpb,
7350c1bc742181ded4930842b46e9507372f0b1b963James Dong                          frameNum,
7360c1bc742181ded4930842b46e9507372f0b1b963James Dong                          mark->operation[i].differenceOfPicNums,
7370c1bc742181ded4930842b46e9507372f0b1b963James Dong                          mark->operation[i].longTermFrameIdx);
7380c1bc742181ded4930842b46e9507372f0b1b963James Dong                        break;
7390c1bc742181ded4930842b46e9507372f0b1b963James Dong
7400c1bc742181ded4930842b46e9507372f0b1b963James Dong                    case 4:
7410c1bc742181ded4930842b46e9507372f0b1b963James Dong                        status = Mmcop4(
7420c1bc742181ded4930842b46e9507372f0b1b963James Dong                          dpb,
7430c1bc742181ded4930842b46e9507372f0b1b963James Dong                          mark->operation[i].maxLongTermFrameIdx);
7440c1bc742181ded4930842b46e9507372f0b1b963James Dong                        break;
7450c1bc742181ded4930842b46e9507372f0b1b963James Dong
7460c1bc742181ded4930842b46e9507372f0b1b963James Dong                    case 5:
7470c1bc742181ded4930842b46e9507372f0b1b963James Dong                        status = Mmcop5(dpb);
7480c1bc742181ded4930842b46e9507372f0b1b963James Dong                        dpb->lastContainsMmco5 = HANTRO_TRUE;
7490c1bc742181ded4930842b46e9507372f0b1b963James Dong                        frameNum = 0;
7500c1bc742181ded4930842b46e9507372f0b1b963James Dong                        break;
7510c1bc742181ded4930842b46e9507372f0b1b963James Dong
7520c1bc742181ded4930842b46e9507372f0b1b963James Dong                    case 6:
7530c1bc742181ded4930842b46e9507372f0b1b963James Dong                        status = Mmcop6(
7540c1bc742181ded4930842b46e9507372f0b1b963James Dong                          dpb,
7550c1bc742181ded4930842b46e9507372f0b1b963James Dong                          frameNum,
7560c1bc742181ded4930842b46e9507372f0b1b963James Dong                          picOrderCnt,
7570c1bc742181ded4930842b46e9507372f0b1b963James Dong                          mark->operation[i].longTermFrameIdx);
7580c1bc742181ded4930842b46e9507372f0b1b963James Dong                        if (status == HANTRO_OK)
7590c1bc742181ded4930842b46e9507372f0b1b963James Dong                            markedAsLongTerm = HANTRO_TRUE;
7600c1bc742181ded4930842b46e9507372f0b1b963James Dong                        break;
7610c1bc742181ded4930842b46e9507372f0b1b963James Dong
7620c1bc742181ded4930842b46e9507372f0b1b963James Dong                    default: /* invalid memory management control operation */
7630c1bc742181ded4930842b46e9507372f0b1b963James Dong                        status = HANTRO_NOK;
7640c1bc742181ded4930842b46e9507372f0b1b963James Dong                        break;
7650c1bc742181ded4930842b46e9507372f0b1b963James Dong                }
7660c1bc742181ded4930842b46e9507372f0b1b963James Dong                if (status != HANTRO_OK)
7670c1bc742181ded4930842b46e9507372f0b1b963James Dong                {
7680c1bc742181ded4930842b46e9507372f0b1b963James Dong                    break;
7690c1bc742181ded4930842b46e9507372f0b1b963James Dong                }
7700c1bc742181ded4930842b46e9507372f0b1b963James Dong                i++;
7710c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
7720c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
7730c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
7740c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
7750c1bc742181ded4930842b46e9507372f0b1b963James Dong            status = SlidingWindowRefPicMarking(dpb);
7760c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
7770c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* if current picture was not marked as long-term reference by
7780c1bc742181ded4930842b46e9507372f0b1b963James Dong         * memory management control operation 6 -> mark current as short
7790c1bc742181ded4930842b46e9507372f0b1b963James Dong         * term and insert it into dpb (if there is room) */
7800c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (!markedAsLongTerm)
7810c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
7820c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (dpb->numRefFrames < dpb->maxRefFrames)
7830c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
7840c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->currentOut->frameNum = frameNum;
7850c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->currentOut->picNum   = (i32)frameNum;
7860c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->currentOut->picOrderCnt = picOrderCnt;
7870c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->currentOut->status   = SHORT_TERM;
7880c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->currentOut->toBeDisplayed = toBeDisplayed;
7890c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->fullness++;
7900c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->numRefFrames++;
7910c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
7920c1bc742181ded4930842b46e9507372f0b1b963James Dong            /* no room */
7930c1bc742181ded4930842b46e9507372f0b1b963James Dong            else
7940c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
7950c1bc742181ded4930842b46e9507372f0b1b963James Dong                status = HANTRO_NOK;
7960c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
7970c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
7980c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
7990c1bc742181ded4930842b46e9507372f0b1b963James Dong
8000c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->currentOut->isIdr = isIdr;
8010c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->currentOut->picId = currentPicId;
8020c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->currentOut->numErrMbs = numErrMbs;
8030c1bc742181ded4930842b46e9507372f0b1b963James Dong
8040c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* dpb was initialized to not to reorder the pictures -> output current
8050c1bc742181ded4930842b46e9507372f0b1b963James Dong     * picture immediately */
8060c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (dpb->noReordering)
8070c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
8080c1bc742181ded4930842b46e9507372f0b1b963James Dong        ASSERT(dpb->numOut == 0);
8090c1bc742181ded4930842b46e9507372f0b1b963James Dong        ASSERT(dpb->outIndex == 0);
8100c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->outBuf[dpb->numOut].data  = dpb->currentOut->data;
8110c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->outBuf[dpb->numOut].isIdr = dpb->currentOut->isIdr;
8120c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->outBuf[dpb->numOut].picId = dpb->currentOut->picId;
8130c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->outBuf[dpb->numOut].numErrMbs = dpb->currentOut->numErrMbs;
8140c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->numOut++;
8150c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
8160c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
8170c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
8180c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* output pictures if buffer full */
8190c1bc742181ded4930842b46e9507372f0b1b963James Dong        while (dpb->fullness > dpb->dpbSize)
8200c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
8210c1bc742181ded4930842b46e9507372f0b1b963James Dong            i = OutputPicture(dpb);
8220c1bc742181ded4930842b46e9507372f0b1b963James Dong            ASSERT(i == HANTRO_OK);
8230c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
8240c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
8250c1bc742181ded4930842b46e9507372f0b1b963James Dong
8260c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* sort dpb */
8270c1bc742181ded4930842b46e9507372f0b1b963James Dong    ShellSort(dpb->buffer, dpb->dpbSize+1);
8280c1bc742181ded4930842b46e9507372f0b1b963James Dong
8290c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(status);
8300c1bc742181ded4930842b46e9507372f0b1b963James Dong
8310c1bc742181ded4930842b46e9507372f0b1b963James Dong}
8320c1bc742181ded4930842b46e9507372f0b1b963James Dong
8330c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
8340c1bc742181ded4930842b46e9507372f0b1b963James Dong
8350c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdGetRefPicData
8360c1bc742181ded4930842b46e9507372f0b1b963James Dong
8370c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
8380c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to get reference picture data from the reference picture
8390c1bc742181ded4930842b46e9507372f0b1b963James Dong            list
8400c1bc742181ded4930842b46e9507372f0b1b963James Dong
8410c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
8420c1bc742181ded4930842b46e9507372f0b1b963James Dong            pointer to desired reference picture data
8430c1bc742181ded4930842b46e9507372f0b1b963James Dong            NULL if invalid index or non-existing picture referred
8440c1bc742181ded4930842b46e9507372f0b1b963James Dong
8450c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
8460c1bc742181ded4930842b46e9507372f0b1b963James Dong
8470c1bc742181ded4930842b46e9507372f0b1b963James Dongu8* h264bsdGetRefPicData(dpbStorage_t *dpb, u32 index)
8480c1bc742181ded4930842b46e9507372f0b1b963James Dong{
8490c1bc742181ded4930842b46e9507372f0b1b963James Dong
8500c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
8510c1bc742181ded4930842b46e9507372f0b1b963James Dong
8520c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
8530c1bc742181ded4930842b46e9507372f0b1b963James Dong
8540c1bc742181ded4930842b46e9507372f0b1b963James Dong    if(index > 16 || dpb->list[index] == NULL)
8550c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(NULL);
8560c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if(!IS_EXISTING(*dpb->list[index]))
8570c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(NULL);
8580c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
8590c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(dpb->list[index]->data);
8600c1bc742181ded4930842b46e9507372f0b1b963James Dong
8610c1bc742181ded4930842b46e9507372f0b1b963James Dong}
8620c1bc742181ded4930842b46e9507372f0b1b963James Dong
8630c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
8640c1bc742181ded4930842b46e9507372f0b1b963James Dong
8650c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdAllocateDpbImage
8660c1bc742181ded4930842b46e9507372f0b1b963James Dong
8670c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
8680c1bc742181ded4930842b46e9507372f0b1b963James Dong            function to allocate memory for a image. This function does not
8690c1bc742181ded4930842b46e9507372f0b1b963James Dong            really allocate any memory but reserves one of the buffer
8700c1bc742181ded4930842b46e9507372f0b1b963James Dong            positions for decoding of current picture
8710c1bc742181ded4930842b46e9507372f0b1b963James Dong
8720c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
8730c1bc742181ded4930842b46e9507372f0b1b963James Dong            pointer to memory area for the image
8740c1bc742181ded4930842b46e9507372f0b1b963James Dong
8750c1bc742181ded4930842b46e9507372f0b1b963James Dong
8760c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
8770c1bc742181ded4930842b46e9507372f0b1b963James Dong
8780c1bc742181ded4930842b46e9507372f0b1b963James Dongu8* h264bsdAllocateDpbImage(dpbStorage_t *dpb)
8790c1bc742181ded4930842b46e9507372f0b1b963James Dong{
8800c1bc742181ded4930842b46e9507372f0b1b963James Dong
8810c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
8820c1bc742181ded4930842b46e9507372f0b1b963James Dong
8830c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
8840c1bc742181ded4930842b46e9507372f0b1b963James Dong
8850c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT( !dpb->buffer[dpb->dpbSize].toBeDisplayed &&
8860c1bc742181ded4930842b46e9507372f0b1b963James Dong            !IS_REFERENCE(dpb->buffer[dpb->dpbSize]) );
8870c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpb->fullness <=  dpb->dpbSize);
8880c1bc742181ded4930842b46e9507372f0b1b963James Dong
8890c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->currentOut = dpb->buffer + dpb->dpbSize;
8900c1bc742181ded4930842b46e9507372f0b1b963James Dong
8910c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(dpb->currentOut->data);
8920c1bc742181ded4930842b46e9507372f0b1b963James Dong
8930c1bc742181ded4930842b46e9507372f0b1b963James Dong}
8940c1bc742181ded4930842b46e9507372f0b1b963James Dong
8950c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
8960c1bc742181ded4930842b46e9507372f0b1b963James Dong
8970c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: SlidingWindowRefPicMarking
8980c1bc742181ded4930842b46e9507372f0b1b963James Dong
8990c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
9000c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to perform sliding window refence picture marking process.
9010c1bc742181ded4930842b46e9507372f0b1b963James Dong
9020c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
9030c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK      success
9040c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_NOK     failure, no short-term reference frame found that
9050c1bc742181ded4930842b46e9507372f0b1b963James Dong                           could be marked unused
9060c1bc742181ded4930842b46e9507372f0b1b963James Dong
9070c1bc742181ded4930842b46e9507372f0b1b963James Dong
9080c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
9090c1bc742181ded4930842b46e9507372f0b1b963James Dong
9100c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 SlidingWindowRefPicMarking(dpbStorage_t *dpb)
9110c1bc742181ded4930842b46e9507372f0b1b963James Dong{
9120c1bc742181ded4930842b46e9507372f0b1b963James Dong
9130c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
9140c1bc742181ded4930842b46e9507372f0b1b963James Dong
9150c1bc742181ded4930842b46e9507372f0b1b963James Dong    i32 index, picNum;
9160c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i;
9170c1bc742181ded4930842b46e9507372f0b1b963James Dong
9180c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
9190c1bc742181ded4930842b46e9507372f0b1b963James Dong
9200c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (dpb->numRefFrames < dpb->maxRefFrames)
9210c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
9220c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_OK);
9230c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
9240c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
9250c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
9260c1bc742181ded4930842b46e9507372f0b1b963James Dong        index = -1;
9270c1bc742181ded4930842b46e9507372f0b1b963James Dong        picNum = 0;
9280c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* find the oldest short term picture */
9290c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (i = 0; i < dpb->numRefFrames; i++)
9300c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (IS_SHORT_TERM(dpb->buffer[i]))
9310c1bc742181ded4930842b46e9507372f0b1b963James Dong                if (dpb->buffer[i].picNum < picNum || index == -1)
9320c1bc742181ded4930842b46e9507372f0b1b963James Dong                {
9330c1bc742181ded4930842b46e9507372f0b1b963James Dong                    index = (i32)i;
9340c1bc742181ded4930842b46e9507372f0b1b963James Dong                    picNum = dpb->buffer[i].picNum;
9350c1bc742181ded4930842b46e9507372f0b1b963James Dong                }
9360c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (index >= 0)
9370c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
9380c1bc742181ded4930842b46e9507372f0b1b963James Dong            SET_UNUSED(dpb->buffer[index]);
9390c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->numRefFrames--;
9400c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (!dpb->buffer[index].toBeDisplayed)
9410c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->fullness--;
9420c1bc742181ded4930842b46e9507372f0b1b963James Dong
9430c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(HANTRO_OK);
9440c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
9450c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
9460c1bc742181ded4930842b46e9507372f0b1b963James Dong
9470c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(HANTRO_NOK);
9480c1bc742181ded4930842b46e9507372f0b1b963James Dong
9490c1bc742181ded4930842b46e9507372f0b1b963James Dong}
9500c1bc742181ded4930842b46e9507372f0b1b963James Dong
9510c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
9520c1bc742181ded4930842b46e9507372f0b1b963James Dong
9530c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdInitDpb
9540c1bc742181ded4930842b46e9507372f0b1b963James Dong
9550c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
9560c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to initialize DPB. Reserves memories for the buffer,
9570c1bc742181ded4930842b46e9507372f0b1b963James Dong            reference picture list and output buffer. dpbSize indicates
9580c1bc742181ded4930842b46e9507372f0b1b963James Dong            the maximum DPB size indicated by the levelIdc in the stream.
9590c1bc742181ded4930842b46e9507372f0b1b963James Dong            If noReordering flag is FALSE the DPB stores dpbSize pictures
9600c1bc742181ded4930842b46e9507372f0b1b963James Dong            for display reordering purposes. On the other hand, if the
9610c1bc742181ded4930842b46e9507372f0b1b963James Dong            flag is TRUE the DPB only stores maxRefFrames reference pictures
9620c1bc742181ded4930842b46e9507372f0b1b963James Dong            and outputs all the pictures immediately.
9630c1bc742181ded4930842b46e9507372f0b1b963James Dong
9640c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
9650c1bc742181ded4930842b46e9507372f0b1b963James Dong            picSizeInMbs    picture size in macroblocks
9660c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpbSize         size of the DPB (number of pictures)
9670c1bc742181ded4930842b46e9507372f0b1b963James Dong            maxRefFrames    max number of reference frames
9680c1bc742181ded4930842b46e9507372f0b1b963James Dong            maxFrameNum     max frame number
9690c1bc742181ded4930842b46e9507372f0b1b963James Dong            noReordering    flag to indicate that DPB does not have to
9700c1bc742181ded4930842b46e9507372f0b1b963James Dong                            prepare to reorder frames for display
9710c1bc742181ded4930842b46e9507372f0b1b963James Dong
9720c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
9730c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb             pointer to dpb data storage
9740c1bc742181ded4930842b46e9507372f0b1b963James Dong
9750c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
9760c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK       success
9770c1bc742181ded4930842b46e9507372f0b1b963James Dong            MEMORY_ALLOCATION_ERROR if memory allocation failed
9780c1bc742181ded4930842b46e9507372f0b1b963James Dong
9790c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
9800c1bc742181ded4930842b46e9507372f0b1b963James Dong
9810c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdInitDpb(
9820c1bc742181ded4930842b46e9507372f0b1b963James Dong  dpbStorage_t *dpb,
9830c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 picSizeInMbs,
9840c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 dpbSize,
9850c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 maxRefFrames,
9860c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 maxFrameNum,
9870c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 noReordering)
9880c1bc742181ded4930842b46e9507372f0b1b963James Dong{
9890c1bc742181ded4930842b46e9507372f0b1b963James Dong
9900c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
9910c1bc742181ded4930842b46e9507372f0b1b963James Dong
9920c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i;
9930c1bc742181ded4930842b46e9507372f0b1b963James Dong
9940c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
9950c1bc742181ded4930842b46e9507372f0b1b963James Dong
9960c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(picSizeInMbs);
9970c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(maxRefFrames <= MAX_NUM_REF_PICS);
9980c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(maxRefFrames <= dpbSize);
9990c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(maxFrameNum);
10000c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpbSize);
10010c1bc742181ded4930842b46e9507372f0b1b963James Dong
1002d0090759e79208d7203280166018bb7d5d4f9d02Marco Nelissen    // see comment in loop below about size calculation
1003d0090759e79208d7203280166018bb7d5d4f9d02Marco Nelissen    if (picSizeInMbs > (UINT32_MAX - 32 - 15) / 384) {
1004d0090759e79208d7203280166018bb7d5d4f9d02Marco Nelissen        ALOGE("b/28533562");
1005d0090759e79208d7203280166018bb7d5d4f9d02Marco Nelissen        android_errorWriteLog(0x534e4554, "28533562");
1006d0090759e79208d7203280166018bb7d5d4f9d02Marco Nelissen        return(MEMORY_ALLOCATION_ERROR);
1007d0090759e79208d7203280166018bb7d5d4f9d02Marco Nelissen    }
1008d0090759e79208d7203280166018bb7d5d4f9d02Marco Nelissen
10090c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->maxLongTermFrameIdx = NO_LONG_TERM_FRAME_INDICES;
10100c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->maxRefFrames        = MAX(maxRefFrames, 1);
10110c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (noReordering)
10120c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->dpbSize         = dpb->maxRefFrames;
10130c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
10140c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->dpbSize         = dpbSize;
10150c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->maxFrameNum         = maxFrameNum;
10160c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->noReordering        = noReordering;
10170c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->fullness            = 0;
10180c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->numRefFrames        = 0;
10190c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->prevRefFrameNum     = 0;
10200c1bc742181ded4930842b46e9507372f0b1b963James Dong
10210c1bc742181ded4930842b46e9507372f0b1b963James Dong    ALLOCATE(dpb->buffer, MAX_NUM_REF_IDX_L0_ACTIVE + 1, dpbPicture_t);
10220c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (dpb->buffer == NULL)
10230c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(MEMORY_ALLOCATION_ERROR);
10240c1bc742181ded4930842b46e9507372f0b1b963James Dong    H264SwDecMemset(dpb->buffer, 0,
10250c1bc742181ded4930842b46e9507372f0b1b963James Dong            (MAX_NUM_REF_IDX_L0_ACTIVE + 1)*sizeof(dpbPicture_t));
10260c1bc742181ded4930842b46e9507372f0b1b963James Dong    for (i = 0; i < dpb->dpbSize + 1; i++)
10270c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
10280c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* Allocate needed amount of memory, which is:
10290c1bc742181ded4930842b46e9507372f0b1b963James Dong         * image size + 32 + 15, where 32 cames from the fact that in ARM OpenMax
10300c1bc742181ded4930842b46e9507372f0b1b963James Dong         * DL implementation Functions may read beyond the end of an array,
10310c1bc742181ded4930842b46e9507372f0b1b963James Dong         * by a maximum of 32 bytes. And +15 cames for the need to align memory
10320c1bc742181ded4930842b46e9507372f0b1b963James Dong         * to 16-byte boundary */
10330c1bc742181ded4930842b46e9507372f0b1b963James Dong        ALLOCATE(dpb->buffer[i].pAllocatedData, (picSizeInMbs*384 + 32+15), u8);
10340c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (dpb->buffer[i].pAllocatedData == NULL)
10350c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(MEMORY_ALLOCATION_ERROR);
10360c1bc742181ded4930842b46e9507372f0b1b963James Dong
10370c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->buffer[i].data = ALIGN(dpb->buffer[i].pAllocatedData, 16);
10380c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
10390c1bc742181ded4930842b46e9507372f0b1b963James Dong
10400c1bc742181ded4930842b46e9507372f0b1b963James Dong    ALLOCATE(dpb->list, MAX_NUM_REF_IDX_L0_ACTIVE + 1, dpbPicture_t*);
10410c1bc742181ded4930842b46e9507372f0b1b963James Dong    ALLOCATE(dpb->outBuf, dpb->dpbSize+1, dpbOutPicture_t);
10420c1bc742181ded4930842b46e9507372f0b1b963James Dong
10430c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (dpb->list == NULL || dpb->outBuf == NULL)
10440c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(MEMORY_ALLOCATION_ERROR);
10450c1bc742181ded4930842b46e9507372f0b1b963James Dong
10460c1bc742181ded4930842b46e9507372f0b1b963James Dong    H264SwDecMemset(dpb->list, 0,
10470c1bc742181ded4930842b46e9507372f0b1b963James Dong            ((MAX_NUM_REF_IDX_L0_ACTIVE + 1) * sizeof(dpbPicture_t*)) );
10480c1bc742181ded4930842b46e9507372f0b1b963James Dong
10490c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->numOut = dpb->outIndex = 0;
10500c1bc742181ded4930842b46e9507372f0b1b963James Dong
10510c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(HANTRO_OK);
10520c1bc742181ded4930842b46e9507372f0b1b963James Dong
10530c1bc742181ded4930842b46e9507372f0b1b963James Dong}
10540c1bc742181ded4930842b46e9507372f0b1b963James Dong
10550c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
10560c1bc742181ded4930842b46e9507372f0b1b963James Dong
10570c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdResetDpb
10580c1bc742181ded4930842b46e9507372f0b1b963James Dong
10590c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
10600c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to reset DPB. This function should be called when an IDR
10610c1bc742181ded4930842b46e9507372f0b1b963James Dong            slice (other than the first) activates new sequence parameter set.
10620c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function calls h264bsdFreeDpb to free old allocated memories and
10630c1bc742181ded4930842b46e9507372f0b1b963James Dong            h264bsdInitDpb to re-initialize the DPB. Same inputs, outputs and
10640c1bc742181ded4930842b46e9507372f0b1b963James Dong            returns as for h264bsdInitDpb.
10650c1bc742181ded4930842b46e9507372f0b1b963James Dong
10660c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
10670c1bc742181ded4930842b46e9507372f0b1b963James Dong
10680c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdResetDpb(
10690c1bc742181ded4930842b46e9507372f0b1b963James Dong  dpbStorage_t *dpb,
10700c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 picSizeInMbs,
10710c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 dpbSize,
10720c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 maxRefFrames,
10730c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 maxFrameNum,
10740c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 noReordering)
10750c1bc742181ded4930842b46e9507372f0b1b963James Dong{
10760c1bc742181ded4930842b46e9507372f0b1b963James Dong
10770c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
10780c1bc742181ded4930842b46e9507372f0b1b963James Dong
10790c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(picSizeInMbs);
10800c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(maxRefFrames <= MAX_NUM_REF_PICS);
10810c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(maxRefFrames <= dpbSize);
10820c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(maxFrameNum);
10830c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpbSize);
10840c1bc742181ded4930842b46e9507372f0b1b963James Dong
10850c1bc742181ded4930842b46e9507372f0b1b963James Dong    h264bsdFreeDpb(dpb);
10860c1bc742181ded4930842b46e9507372f0b1b963James Dong
10870c1bc742181ded4930842b46e9507372f0b1b963James Dong    return h264bsdInitDpb(dpb, picSizeInMbs, dpbSize, maxRefFrames,
10880c1bc742181ded4930842b46e9507372f0b1b963James Dong                          maxFrameNum, noReordering);
10890c1bc742181ded4930842b46e9507372f0b1b963James Dong}
10900c1bc742181ded4930842b46e9507372f0b1b963James Dong
10910c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
10920c1bc742181ded4930842b46e9507372f0b1b963James Dong
10930c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdInitRefPicList
10940c1bc742181ded4930842b46e9507372f0b1b963James Dong
10950c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
10960c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to initialize reference picture list. Function just
10970c1bc742181ded4930842b46e9507372f0b1b963James Dong            sets pointers in the list according to pictures in the buffer.
10980c1bc742181ded4930842b46e9507372f0b1b963James Dong            The buffer is assumed to contain pictures sorted according to
10990c1bc742181ded4930842b46e9507372f0b1b963James Dong            what the H.264 standard says about initial reference picture list.
11000c1bc742181ded4930842b46e9507372f0b1b963James Dong
11010c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
11020c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb     pointer to dpb data structure
11030c1bc742181ded4930842b46e9507372f0b1b963James Dong
11040c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
11050c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb     'list' field initialized
11060c1bc742181ded4930842b46e9507372f0b1b963James Dong
11070c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
11080c1bc742181ded4930842b46e9507372f0b1b963James Dong            none
11090c1bc742181ded4930842b46e9507372f0b1b963James Dong
11100c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
11110c1bc742181ded4930842b46e9507372f0b1b963James Dong
11120c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid h264bsdInitRefPicList(dpbStorage_t *dpb)
11130c1bc742181ded4930842b46e9507372f0b1b963James Dong{
11140c1bc742181ded4930842b46e9507372f0b1b963James Dong
11150c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
11160c1bc742181ded4930842b46e9507372f0b1b963James Dong
11170c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i;
11180c1bc742181ded4930842b46e9507372f0b1b963James Dong
11190c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
11200c1bc742181ded4930842b46e9507372f0b1b963James Dong
11210c1bc742181ded4930842b46e9507372f0b1b963James Dong    for (i = 0; i < dpb->numRefFrames; i++)
11220c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->list[i] = &dpb->buffer[i];
11230c1bc742181ded4930842b46e9507372f0b1b963James Dong
11240c1bc742181ded4930842b46e9507372f0b1b963James Dong}
11250c1bc742181ded4930842b46e9507372f0b1b963James Dong
11260c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
11270c1bc742181ded4930842b46e9507372f0b1b963James Dong
11280c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: FindDpbPic
11290c1bc742181ded4930842b46e9507372f0b1b963James Dong
11300c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
11310c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to find a reference picture from the buffer. The picture
11320c1bc742181ded4930842b46e9507372f0b1b963James Dong            to be found is identified by picNum and isShortTerm flag.
11330c1bc742181ded4930842b46e9507372f0b1b963James Dong
11340c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
11350c1bc742181ded4930842b46e9507372f0b1b963James Dong            index of the picture in the buffer
11360c1bc742181ded4930842b46e9507372f0b1b963James Dong            -1 if the specified picture was not found in the buffer
11370c1bc742181ded4930842b46e9507372f0b1b963James Dong
11380c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
11390c1bc742181ded4930842b46e9507372f0b1b963James Dong
11400c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic i32 FindDpbPic(dpbStorage_t *dpb, i32 picNum, u32 isShortTerm)
11410c1bc742181ded4930842b46e9507372f0b1b963James Dong{
11420c1bc742181ded4930842b46e9507372f0b1b963James Dong
11430c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
11440c1bc742181ded4930842b46e9507372f0b1b963James Dong
11450c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i = 0;
11460c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 found = HANTRO_FALSE;
11470c1bc742181ded4930842b46e9507372f0b1b963James Dong
11480c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
11490c1bc742181ded4930842b46e9507372f0b1b963James Dong
11500c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (isShortTerm)
11510c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
11520c1bc742181ded4930842b46e9507372f0b1b963James Dong        while (i < dpb->maxRefFrames && !found)
11530c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
11540c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (IS_SHORT_TERM(dpb->buffer[i]) &&
11550c1bc742181ded4930842b46e9507372f0b1b963James Dong              dpb->buffer[i].picNum == picNum)
11560c1bc742181ded4930842b46e9507372f0b1b963James Dong                found = HANTRO_TRUE;
11570c1bc742181ded4930842b46e9507372f0b1b963James Dong            else
11580c1bc742181ded4930842b46e9507372f0b1b963James Dong                i++;
11590c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
11600c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
11610c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
11620c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
11630c1bc742181ded4930842b46e9507372f0b1b963James Dong        ASSERT(picNum >= 0);
11640c1bc742181ded4930842b46e9507372f0b1b963James Dong        while (i < dpb->maxRefFrames && !found)
11650c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
11660c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (IS_LONG_TERM(dpb->buffer[i]) &&
11670c1bc742181ded4930842b46e9507372f0b1b963James Dong              dpb->buffer[i].picNum == picNum)
11680c1bc742181ded4930842b46e9507372f0b1b963James Dong                found = HANTRO_TRUE;
11690c1bc742181ded4930842b46e9507372f0b1b963James Dong            else
11700c1bc742181ded4930842b46e9507372f0b1b963James Dong                i++;
11710c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
11720c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
11730c1bc742181ded4930842b46e9507372f0b1b963James Dong
11740c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (found)
11750c1bc742181ded4930842b46e9507372f0b1b963James Dong        return((i32)i);
11760c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
11770c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(-1);
11780c1bc742181ded4930842b46e9507372f0b1b963James Dong
11790c1bc742181ded4930842b46e9507372f0b1b963James Dong}
11800c1bc742181ded4930842b46e9507372f0b1b963James Dong
11810c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
11820c1bc742181ded4930842b46e9507372f0b1b963James Dong
11830c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: SetPicNums
11840c1bc742181ded4930842b46e9507372f0b1b963James Dong
11850c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
11860c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to set picNum values for short-term pictures in the
11870c1bc742181ded4930842b46e9507372f0b1b963James Dong            buffer. Numbering of pictures is based on frame numbers and as
11880c1bc742181ded4930842b46e9507372f0b1b963James Dong            frame numbers are modulo maxFrameNum -> frame numbers of older
11890c1bc742181ded4930842b46e9507372f0b1b963James Dong            pictures in the buffer may be bigger than the currFrameNum.
11900c1bc742181ded4930842b46e9507372f0b1b963James Dong            picNums will be set so that current frame has the largest picNum
11910c1bc742181ded4930842b46e9507372f0b1b963James Dong            and all the short-term frames in the buffer will get smaller picNum
11920c1bc742181ded4930842b46e9507372f0b1b963James Dong            representing their "distance" from the current frame. This
11930c1bc742181ded4930842b46e9507372f0b1b963James Dong            function kind of maps the modulo arithmetic back to normal.
11940c1bc742181ded4930842b46e9507372f0b1b963James Dong
11950c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
11960c1bc742181ded4930842b46e9507372f0b1b963James Dong
11970c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic void SetPicNums(dpbStorage_t *dpb, u32 currFrameNum)
11980c1bc742181ded4930842b46e9507372f0b1b963James Dong{
11990c1bc742181ded4930842b46e9507372f0b1b963James Dong
12000c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
12010c1bc742181ded4930842b46e9507372f0b1b963James Dong
12020c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i;
12030c1bc742181ded4930842b46e9507372f0b1b963James Dong    i32 frameNumWrap;
12040c1bc742181ded4930842b46e9507372f0b1b963James Dong
12050c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
12060c1bc742181ded4930842b46e9507372f0b1b963James Dong
12070c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpb);
12080c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(currFrameNum < dpb->maxFrameNum);
12090c1bc742181ded4930842b46e9507372f0b1b963James Dong
12100c1bc742181ded4930842b46e9507372f0b1b963James Dong    for (i = 0; i < dpb->numRefFrames; i++)
12110c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (IS_SHORT_TERM(dpb->buffer[i]))
12120c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
12130c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (dpb->buffer[i].frameNum > currFrameNum)
12140c1bc742181ded4930842b46e9507372f0b1b963James Dong                frameNumWrap =
12150c1bc742181ded4930842b46e9507372f0b1b963James Dong                    (i32)dpb->buffer[i].frameNum - (i32)dpb->maxFrameNum;
12160c1bc742181ded4930842b46e9507372f0b1b963James Dong            else
12170c1bc742181ded4930842b46e9507372f0b1b963James Dong                frameNumWrap = (i32)dpb->buffer[i].frameNum;
12180c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->buffer[i].picNum = frameNumWrap;
12190c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
12200c1bc742181ded4930842b46e9507372f0b1b963James Dong
12210c1bc742181ded4930842b46e9507372f0b1b963James Dong}
12220c1bc742181ded4930842b46e9507372f0b1b963James Dong
12230c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
12240c1bc742181ded4930842b46e9507372f0b1b963James Dong
12250c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdCheckGapsInFrameNum
12260c1bc742181ded4930842b46e9507372f0b1b963James Dong
12270c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
12280c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to check gaps in frame_num and generate non-existing
12290c1bc742181ded4930842b46e9507372f0b1b963James Dong            (short term) reference pictures if necessary. This function should
12300c1bc742181ded4930842b46e9507372f0b1b963James Dong            be called only for non-IDR pictures.
12310c1bc742181ded4930842b46e9507372f0b1b963James Dong
12320c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
12330c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb         pointer to dpb data structure
12340c1bc742181ded4930842b46e9507372f0b1b963James Dong            frameNum    frame number of the current picture
12350c1bc742181ded4930842b46e9507372f0b1b963James Dong            isRefPic    flag to indicate if current picture is a reference or
12360c1bc742181ded4930842b46e9507372f0b1b963James Dong                        non-reference picture
12370c1bc742181ded4930842b46e9507372f0b1b963James Dong            gapsAllowed Flag which indicates active SPS stance on whether
12380c1bc742181ded4930842b46e9507372f0b1b963James Dong                        to allow gaps
12390c1bc742181ded4930842b46e9507372f0b1b963James Dong
12400c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
12410c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb         'buffer' possibly modified by inserting non-existing
12420c1bc742181ded4930842b46e9507372f0b1b963James Dong                        pictures with sliding window marking process
12430c1bc742181ded4930842b46e9507372f0b1b963James Dong
12440c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
12450c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK   success
12460c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_NOK  error in sliding window reference picture marking or
12470c1bc742181ded4930842b46e9507372f0b1b963James Dong                        frameNum equal to previous reference frame used for
12480c1bc742181ded4930842b46e9507372f0b1b963James Dong                        a reference picture
12490c1bc742181ded4930842b46e9507372f0b1b963James Dong
12500c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
12510c1bc742181ded4930842b46e9507372f0b1b963James Dong
12520c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdCheckGapsInFrameNum(dpbStorage_t *dpb, u32 frameNum, u32 isRefPic,
12530c1bc742181ded4930842b46e9507372f0b1b963James Dong                               u32 gapsAllowed)
12540c1bc742181ded4930842b46e9507372f0b1b963James Dong{
12550c1bc742181ded4930842b46e9507372f0b1b963James Dong
12560c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
12570c1bc742181ded4930842b46e9507372f0b1b963James Dong
12580c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 unUsedShortTermFrameNum;
12590c1bc742181ded4930842b46e9507372f0b1b963James Dong    u8 *tmp;
12600c1bc742181ded4930842b46e9507372f0b1b963James Dong
12610c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
12620c1bc742181ded4930842b46e9507372f0b1b963James Dong
12630c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpb);
12640c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpb->fullness <= dpb->dpbSize);
12650c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(frameNum < dpb->maxFrameNum);
12660c1bc742181ded4930842b46e9507372f0b1b963James Dong
12670c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->numOut = 0;
12680c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->outIndex = 0;
12690c1bc742181ded4930842b46e9507372f0b1b963James Dong
12700c1bc742181ded4930842b46e9507372f0b1b963James Dong    if(!gapsAllowed)
12710c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_OK);
12720c1bc742181ded4930842b46e9507372f0b1b963James Dong
12730c1bc742181ded4930842b46e9507372f0b1b963James Dong    if ( (frameNum != dpb->prevRefFrameNum) &&
12740c1bc742181ded4930842b46e9507372f0b1b963James Dong         (frameNum != ((dpb->prevRefFrameNum + 1) % dpb->maxFrameNum)))
12750c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
12760c1bc742181ded4930842b46e9507372f0b1b963James Dong
12770c1bc742181ded4930842b46e9507372f0b1b963James Dong        unUsedShortTermFrameNum = (dpb->prevRefFrameNum + 1) % dpb->maxFrameNum;
12780c1bc742181ded4930842b46e9507372f0b1b963James Dong
12790c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* store data pointer of last buffer position to be used as next
12800c1bc742181ded4930842b46e9507372f0b1b963James Dong         * "allocated" data pointer if last buffer position after this process
12810c1bc742181ded4930842b46e9507372f0b1b963James Dong         * contains data pointer located in outBuf (buffer placed in the output
12820c1bc742181ded4930842b46e9507372f0b1b963James Dong         * shall not be overwritten by the current picture) */
12830c1bc742181ded4930842b46e9507372f0b1b963James Dong        tmp = dpb->buffer[dpb->dpbSize].data;
12840c1bc742181ded4930842b46e9507372f0b1b963James Dong        do
12850c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
12860c1bc742181ded4930842b46e9507372f0b1b963James Dong            SetPicNums(dpb, unUsedShortTermFrameNum);
12870c1bc742181ded4930842b46e9507372f0b1b963James Dong
12880c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (SlidingWindowRefPicMarking(dpb) != HANTRO_OK)
12890c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
12900c1bc742181ded4930842b46e9507372f0b1b963James Dong                return(HANTRO_NOK);
12910c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
12920c1bc742181ded4930842b46e9507372f0b1b963James Dong
12930c1bc742181ded4930842b46e9507372f0b1b963James Dong            /* output pictures if buffer full */
12940c1bc742181ded4930842b46e9507372f0b1b963James Dong            while (dpb->fullness >= dpb->dpbSize)
12950c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
12960c1bc742181ded4930842b46e9507372f0b1b963James Dong#ifdef _ASSERT_USED
12970c1bc742181ded4930842b46e9507372f0b1b963James Dong                ASSERT(!dpb->noReordering);
12980c1bc742181ded4930842b46e9507372f0b1b963James Dong                ASSERT(OutputPicture(dpb) == HANTRO_OK);
12990c1bc742181ded4930842b46e9507372f0b1b963James Dong#else
13000c1bc742181ded4930842b46e9507372f0b1b963James Dong                OutputPicture(dpb);
13010c1bc742181ded4930842b46e9507372f0b1b963James Dong#endif
13020c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
13030c1bc742181ded4930842b46e9507372f0b1b963James Dong
13040c1bc742181ded4930842b46e9507372f0b1b963James Dong            /* add to end of list */
13050c1bc742181ded4930842b46e9507372f0b1b963James Dong            ASSERT( !dpb->buffer[dpb->dpbSize].toBeDisplayed &&
13060c1bc742181ded4930842b46e9507372f0b1b963James Dong                    !IS_REFERENCE(dpb->buffer[dpb->dpbSize]) );
13070c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->buffer[dpb->dpbSize].status = NON_EXISTING;
13080c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->buffer[dpb->dpbSize].frameNum = unUsedShortTermFrameNum;
13090c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->buffer[dpb->dpbSize].picNum   = (i32)unUsedShortTermFrameNum;
13100c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->buffer[dpb->dpbSize].picOrderCnt = 0;
13110c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->buffer[dpb->dpbSize].toBeDisplayed = HANTRO_FALSE;
13120c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->fullness++;
13130c1bc742181ded4930842b46e9507372f0b1b963James Dong            dpb->numRefFrames++;
13140c1bc742181ded4930842b46e9507372f0b1b963James Dong
13150c1bc742181ded4930842b46e9507372f0b1b963James Dong            /* sort the buffer */
13160c1bc742181ded4930842b46e9507372f0b1b963James Dong            ShellSort(dpb->buffer, dpb->dpbSize+1);
13170c1bc742181ded4930842b46e9507372f0b1b963James Dong
13180c1bc742181ded4930842b46e9507372f0b1b963James Dong            unUsedShortTermFrameNum = (unUsedShortTermFrameNum + 1) %
13190c1bc742181ded4930842b46e9507372f0b1b963James Dong                dpb->maxFrameNum;
13200c1bc742181ded4930842b46e9507372f0b1b963James Dong
13210c1bc742181ded4930842b46e9507372f0b1b963James Dong        } while (unUsedShortTermFrameNum != frameNum);
13220c1bc742181ded4930842b46e9507372f0b1b963James Dong
13230c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* pictures placed in output buffer -> check that 'data' in
13240c1bc742181ded4930842b46e9507372f0b1b963James Dong         * buffer position dpbSize is not in the output buffer (this will be
13250c1bc742181ded4930842b46e9507372f0b1b963James Dong         * "allocated" by h264bsdAllocateDpbImage). If it is -> exchange data
13260c1bc742181ded4930842b46e9507372f0b1b963James Dong         * pointer with the one stored in the beginning */
13270c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (dpb->numOut)
13280c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
13290c1bc742181ded4930842b46e9507372f0b1b963James Dong            u32 i;
13300c1bc742181ded4930842b46e9507372f0b1b963James Dong
13310c1bc742181ded4930842b46e9507372f0b1b963James Dong            for (i = 0; i < dpb->numOut; i++)
13320c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
13330c1bc742181ded4930842b46e9507372f0b1b963James Dong                if (dpb->outBuf[i].data == dpb->buffer[dpb->dpbSize].data)
13340c1bc742181ded4930842b46e9507372f0b1b963James Dong                {
13350c1bc742181ded4930842b46e9507372f0b1b963James Dong                    /* find buffer position containing data pointer stored in
13360c1bc742181ded4930842b46e9507372f0b1b963James Dong                     * tmp */
13370c1bc742181ded4930842b46e9507372f0b1b963James Dong                    for (i = 0; i < dpb->dpbSize; i++)
13380c1bc742181ded4930842b46e9507372f0b1b963James Dong                    {
13390c1bc742181ded4930842b46e9507372f0b1b963James Dong                        if (dpb->buffer[i].data == tmp)
13400c1bc742181ded4930842b46e9507372f0b1b963James Dong                        {
13410c1bc742181ded4930842b46e9507372f0b1b963James Dong                            dpb->buffer[i].data =
13420c1bc742181ded4930842b46e9507372f0b1b963James Dong                                dpb->buffer[dpb->dpbSize].data;
13430c1bc742181ded4930842b46e9507372f0b1b963James Dong                            dpb->buffer[dpb->dpbSize].data = tmp;
13440c1bc742181ded4930842b46e9507372f0b1b963James Dong                            break;
13450c1bc742181ded4930842b46e9507372f0b1b963James Dong                        }
13460c1bc742181ded4930842b46e9507372f0b1b963James Dong                    }
13470c1bc742181ded4930842b46e9507372f0b1b963James Dong                    ASSERT(i < dpb->dpbSize);
13480c1bc742181ded4930842b46e9507372f0b1b963James Dong                    break;
13490c1bc742181ded4930842b46e9507372f0b1b963James Dong                }
13500c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
13510c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
13520c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
13530c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* frameNum for reference pictures shall not be the same as for previous
13540c1bc742181ded4930842b46e9507372f0b1b963James Dong     * reference picture, otherwise accesses to pictures in the buffer cannot
13550c1bc742181ded4930842b46e9507372f0b1b963James Dong     * be solved unambiguously */
13560c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (isRefPic && frameNum == dpb->prevRefFrameNum)
13570c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
13580c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
13590c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
13600c1bc742181ded4930842b46e9507372f0b1b963James Dong
13610c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* save current frame_num in prevRefFrameNum. For non-reference frame
13620c1bc742181ded4930842b46e9507372f0b1b963James Dong     * prevFrameNum is set to frame number of last non-existing frame above */
13630c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (isRefPic)
13640c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->prevRefFrameNum = frameNum;
13650c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (frameNum != dpb->prevRefFrameNum)
13660c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
13670c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->prevRefFrameNum =
13680c1bc742181ded4930842b46e9507372f0b1b963James Dong            (frameNum + dpb->maxFrameNum - 1) % dpb->maxFrameNum;
13690c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
13700c1bc742181ded4930842b46e9507372f0b1b963James Dong
13710c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(HANTRO_OK);
13720c1bc742181ded4930842b46e9507372f0b1b963James Dong
13730c1bc742181ded4930842b46e9507372f0b1b963James Dong}
13740c1bc742181ded4930842b46e9507372f0b1b963James Dong
13750c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
13760c1bc742181ded4930842b46e9507372f0b1b963James Dong
13770c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: FindSmallestPicOrderCnt
13780c1bc742181ded4930842b46e9507372f0b1b963James Dong
13790c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
13800c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to find picture with smallest picture order count. This
13810c1bc742181ded4930842b46e9507372f0b1b963James Dong            will be the next picture in display order.
13820c1bc742181ded4930842b46e9507372f0b1b963James Dong
13830c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
13840c1bc742181ded4930842b46e9507372f0b1b963James Dong            pointer to the picture, NULL if no pictures to be displayed
13850c1bc742181ded4930842b46e9507372f0b1b963James Dong
13860c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
13870c1bc742181ded4930842b46e9507372f0b1b963James Dong
13880c1bc742181ded4930842b46e9507372f0b1b963James DongdpbPicture_t* FindSmallestPicOrderCnt(dpbStorage_t *dpb)
13890c1bc742181ded4930842b46e9507372f0b1b963James Dong{
13900c1bc742181ded4930842b46e9507372f0b1b963James Dong
13910c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
13920c1bc742181ded4930842b46e9507372f0b1b963James Dong
13930c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i;
13940c1bc742181ded4930842b46e9507372f0b1b963James Dong    i32 picOrderCnt;
13950c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpbPicture_t *tmp;
13960c1bc742181ded4930842b46e9507372f0b1b963James Dong
13970c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
13980c1bc742181ded4930842b46e9507372f0b1b963James Dong
13990c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpb);
14000c1bc742181ded4930842b46e9507372f0b1b963James Dong
14010c1bc742181ded4930842b46e9507372f0b1b963James Dong    picOrderCnt = 0x7FFFFFFF;
14020c1bc742181ded4930842b46e9507372f0b1b963James Dong    tmp = NULL;
14030c1bc742181ded4930842b46e9507372f0b1b963James Dong
14040c1bc742181ded4930842b46e9507372f0b1b963James Dong    for (i = 0; i <= dpb->dpbSize; i++)
14050c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
14060c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (dpb->buffer[i].toBeDisplayed &&
14070c1bc742181ded4930842b46e9507372f0b1b963James Dong            (dpb->buffer[i].picOrderCnt < picOrderCnt))
14080c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
14090c1bc742181ded4930842b46e9507372f0b1b963James Dong            tmp = dpb->buffer + i;
14100c1bc742181ded4930842b46e9507372f0b1b963James Dong            picOrderCnt = dpb->buffer[i].picOrderCnt;
14110c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
14120c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
14130c1bc742181ded4930842b46e9507372f0b1b963James Dong
14140c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(tmp);
14150c1bc742181ded4930842b46e9507372f0b1b963James Dong
14160c1bc742181ded4930842b46e9507372f0b1b963James Dong}
14170c1bc742181ded4930842b46e9507372f0b1b963James Dong
14180c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
14190c1bc742181ded4930842b46e9507372f0b1b963James Dong
14200c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: OutputPicture
14210c1bc742181ded4930842b46e9507372f0b1b963James Dong
14220c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
14230c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to put next display order picture into the output buffer.
14240c1bc742181ded4930842b46e9507372f0b1b963James Dong
14250c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
14260c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK      success
14270c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_NOK     no pictures to display
14280c1bc742181ded4930842b46e9507372f0b1b963James Dong
14290c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
14300c1bc742181ded4930842b46e9507372f0b1b963James Dong
14310c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 OutputPicture(dpbStorage_t *dpb)
14320c1bc742181ded4930842b46e9507372f0b1b963James Dong{
14330c1bc742181ded4930842b46e9507372f0b1b963James Dong
14340c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
14350c1bc742181ded4930842b46e9507372f0b1b963James Dong
14360c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpbPicture_t *tmp;
14370c1bc742181ded4930842b46e9507372f0b1b963James Dong
14380c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
14390c1bc742181ded4930842b46e9507372f0b1b963James Dong
14400c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpb);
14410c1bc742181ded4930842b46e9507372f0b1b963James Dong
14420c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (dpb->noReordering)
14430c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
14440c1bc742181ded4930842b46e9507372f0b1b963James Dong
14450c1bc742181ded4930842b46e9507372f0b1b963James Dong    tmp = FindSmallestPicOrderCnt(dpb);
14460c1bc742181ded4930842b46e9507372f0b1b963James Dong
14470c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* no pictures to be displayed */
14480c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (tmp == NULL)
14490c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
14500c1bc742181ded4930842b46e9507372f0b1b963James Dong
14510c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->outBuf[dpb->numOut].data  = tmp->data;
14520c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->outBuf[dpb->numOut].isIdr = tmp->isIdr;
14530c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->outBuf[dpb->numOut].picId = tmp->picId;
14540c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->outBuf[dpb->numOut].numErrMbs = tmp->numErrMbs;
14550c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpb->numOut++;
14560c1bc742181ded4930842b46e9507372f0b1b963James Dong
14570c1bc742181ded4930842b46e9507372f0b1b963James Dong    tmp->toBeDisplayed = HANTRO_FALSE;
14580c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (!IS_REFERENCE(*tmp))
14590c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
14600c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->fullness--;
14610c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
14620c1bc742181ded4930842b46e9507372f0b1b963James Dong
14630c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(HANTRO_OK);
14640c1bc742181ded4930842b46e9507372f0b1b963James Dong
14650c1bc742181ded4930842b46e9507372f0b1b963James Dong}
14660c1bc742181ded4930842b46e9507372f0b1b963James Dong
14670c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
14680c1bc742181ded4930842b46e9507372f0b1b963James Dong
14690c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdDpbOutputPicture
14700c1bc742181ded4930842b46e9507372f0b1b963James Dong
14710c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
14720c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to get next display order picture from the output buffer.
14730c1bc742181ded4930842b46e9507372f0b1b963James Dong
14740c1bc742181ded4930842b46e9507372f0b1b963James Dong        Return:
14750c1bc742181ded4930842b46e9507372f0b1b963James Dong            pointer to output picture structure, NULL if no pictures to
14760c1bc742181ded4930842b46e9507372f0b1b963James Dong            display
14770c1bc742181ded4930842b46e9507372f0b1b963James Dong
14780c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
14790c1bc742181ded4930842b46e9507372f0b1b963James Dong
14800c1bc742181ded4930842b46e9507372f0b1b963James DongdpbOutPicture_t* h264bsdDpbOutputPicture(dpbStorage_t *dpb)
14810c1bc742181ded4930842b46e9507372f0b1b963James Dong{
14820c1bc742181ded4930842b46e9507372f0b1b963James Dong
14830c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
14840c1bc742181ded4930842b46e9507372f0b1b963James Dong
14850c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
14860c1bc742181ded4930842b46e9507372f0b1b963James Dong
14870c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpb);
14880c1bc742181ded4930842b46e9507372f0b1b963James Dong
14890c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (dpb->outIndex < dpb->numOut)
14900c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(dpb->outBuf + dpb->outIndex++);
14910c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
14920c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(NULL);
14930c1bc742181ded4930842b46e9507372f0b1b963James Dong
14940c1bc742181ded4930842b46e9507372f0b1b963James Dong}
14950c1bc742181ded4930842b46e9507372f0b1b963James Dong
14960c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
14970c1bc742181ded4930842b46e9507372f0b1b963James Dong
14980c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdFlushDpb
14990c1bc742181ded4930842b46e9507372f0b1b963James Dong
15000c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
15010c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to flush the DPB. Function puts all pictures needed for
15020c1bc742181ded4930842b46e9507372f0b1b963James Dong            display into the output buffer. This function shall be called in
15030c1bc742181ded4930842b46e9507372f0b1b963James Dong            the end of the stream to obtain pictures buffered for display
15040c1bc742181ded4930842b46e9507372f0b1b963James Dong            re-ordering purposes.
15050c1bc742181ded4930842b46e9507372f0b1b963James Dong
15060c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
15070c1bc742181ded4930842b46e9507372f0b1b963James Dong
15080c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid h264bsdFlushDpb(dpbStorage_t *dpb)
15090c1bc742181ded4930842b46e9507372f0b1b963James Dong{
15100c1bc742181ded4930842b46e9507372f0b1b963James Dong
15110c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* don't do anything if buffer not reserved */
15120c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (dpb->buffer)
15130c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
15140c1bc742181ded4930842b46e9507372f0b1b963James Dong        dpb->flushed = 1;
15150c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* output all pictures */
15160c1bc742181ded4930842b46e9507372f0b1b963James Dong        while (OutputPicture(dpb) == HANTRO_OK)
15170c1bc742181ded4930842b46e9507372f0b1b963James Dong            ;
15180c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
15190c1bc742181ded4930842b46e9507372f0b1b963James Dong
15200c1bc742181ded4930842b46e9507372f0b1b963James Dong}
15210c1bc742181ded4930842b46e9507372f0b1b963James Dong
15220c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
15230c1bc742181ded4930842b46e9507372f0b1b963James Dong
15240c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: h264bsdFreeDpb
15250c1bc742181ded4930842b46e9507372f0b1b963James Dong
15260c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
15270c1bc742181ded4930842b46e9507372f0b1b963James Dong            Function to free memories reserved for the DPB.
15280c1bc742181ded4930842b46e9507372f0b1b963James Dong
15290c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
15300c1bc742181ded4930842b46e9507372f0b1b963James Dong
15310c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid h264bsdFreeDpb(dpbStorage_t *dpb)
15320c1bc742181ded4930842b46e9507372f0b1b963James Dong{
15330c1bc742181ded4930842b46e9507372f0b1b963James Dong
15340c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
15350c1bc742181ded4930842b46e9507372f0b1b963James Dong
15360c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i;
15370c1bc742181ded4930842b46e9507372f0b1b963James Dong
15380c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
15390c1bc742181ded4930842b46e9507372f0b1b963James Dong
15400c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(dpb);
15410c1bc742181ded4930842b46e9507372f0b1b963James Dong
15420c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (dpb->buffer)
15430c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
15440c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (i = 0; i < dpb->dpbSize+1; i++)
15450c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
15460c1bc742181ded4930842b46e9507372f0b1b963James Dong            FREE(dpb->buffer[i].pAllocatedData);
15470c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
15480c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
15490c1bc742181ded4930842b46e9507372f0b1b963James Dong    FREE(dpb->buffer);
15500c1bc742181ded4930842b46e9507372f0b1b963James Dong    FREE(dpb->list);
15510c1bc742181ded4930842b46e9507372f0b1b963James Dong    FREE(dpb->outBuf);
15520c1bc742181ded4930842b46e9507372f0b1b963James Dong
15530c1bc742181ded4930842b46e9507372f0b1b963James Dong}
15540c1bc742181ded4930842b46e9507372f0b1b963James Dong
15550c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
15560c1bc742181ded4930842b46e9507372f0b1b963James Dong
15570c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: ShellSort
15580c1bc742181ded4930842b46e9507372f0b1b963James Dong
15590c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
15600c1bc742181ded4930842b46e9507372f0b1b963James Dong            Sort pictures in the buffer. Function implements Shell's method,
15610c1bc742181ded4930842b46e9507372f0b1b963James Dong            i.e. diminishing increment sort. See e.g. "Numerical Recipes in C"
15620c1bc742181ded4930842b46e9507372f0b1b963James Dong            for more information.
15630c1bc742181ded4930842b46e9507372f0b1b963James Dong
15640c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
15650c1bc742181ded4930842b46e9507372f0b1b963James Dong
15660c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic void ShellSort(dpbPicture_t *pPic, u32 num)
15670c1bc742181ded4930842b46e9507372f0b1b963James Dong{
15680c1bc742181ded4930842b46e9507372f0b1b963James Dong
15690c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i, j;
15700c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 step;
15710c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpbPicture_t tmpPic;
15720c1bc742181ded4930842b46e9507372f0b1b963James Dong
15730c1bc742181ded4930842b46e9507372f0b1b963James Dong    step = 7;
15740c1bc742181ded4930842b46e9507372f0b1b963James Dong
15750c1bc742181ded4930842b46e9507372f0b1b963James Dong    while (step)
15760c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
15770c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (i = step; i < num; i++)
15780c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
15790c1bc742181ded4930842b46e9507372f0b1b963James Dong            tmpPic = pPic[i];
15800c1bc742181ded4930842b46e9507372f0b1b963James Dong            j = i;
15810c1bc742181ded4930842b46e9507372f0b1b963James Dong            while (j >= step && ComparePictures(pPic + j - step, &tmpPic) > 0)
15820c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
15830c1bc742181ded4930842b46e9507372f0b1b963James Dong                pPic[j] = pPic[j-step];
15840c1bc742181ded4930842b46e9507372f0b1b963James Dong                j -= step;
15850c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
15860c1bc742181ded4930842b46e9507372f0b1b963James Dong            pPic[j] = tmpPic;
15870c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
15880c1bc742181ded4930842b46e9507372f0b1b963James Dong        step >>= 1;
15890c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
15900c1bc742181ded4930842b46e9507372f0b1b963James Dong
15910c1bc742181ded4930842b46e9507372f0b1b963James Dong}
15920c1bc742181ded4930842b46e9507372f0b1b963James Dong
1593