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. Module defines
230c1bc742181ded4930842b46e9507372f0b1b963James Dong    3. Data types
240c1bc742181ded4930842b46e9507372f0b1b963James Dong    4. Function prototypes
250c1bc742181ded4930842b46e9507372f0b1b963James Dong
260c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
270c1bc742181ded4930842b46e9507372f0b1b963James Dong
280c1bc742181ded4930842b46e9507372f0b1b963James Dong#ifndef H264SWDEC_DPB_H
290c1bc742181ded4930842b46e9507372f0b1b963James Dong#define H264SWDEC_DPB_H
300c1bc742181ded4930842b46e9507372f0b1b963James Dong
310c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
320c1bc742181ded4930842b46e9507372f0b1b963James Dong    1. Include headers
330c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
340c1bc742181ded4930842b46e9507372f0b1b963James Dong
350c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "basetype.h"
360c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_slice_header.h"
370c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_image.h"
380c1bc742181ded4930842b46e9507372f0b1b963James Dong
390c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
400c1bc742181ded4930842b46e9507372f0b1b963James Dong    2. Module defines
410c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
420c1bc742181ded4930842b46e9507372f0b1b963James Dong
430c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
440c1bc742181ded4930842b46e9507372f0b1b963James Dong    3. Data types
450c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
460c1bc742181ded4930842b46e9507372f0b1b963James Dong
470c1bc742181ded4930842b46e9507372f0b1b963James Dong/* enumeration to represent status of buffered image */
480c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef enum {
490c1bc742181ded4930842b46e9507372f0b1b963James Dong    UNUSED = 0,
500c1bc742181ded4930842b46e9507372f0b1b963James Dong    NON_EXISTING,
510c1bc742181ded4930842b46e9507372f0b1b963James Dong    SHORT_TERM,
520c1bc742181ded4930842b46e9507372f0b1b963James Dong    LONG_TERM
530c1bc742181ded4930842b46e9507372f0b1b963James Dong} dpbPictureStatus_e;
540c1bc742181ded4930842b46e9507372f0b1b963James Dong
550c1bc742181ded4930842b46e9507372f0b1b963James Dong/* structure to represent a buffered picture */
560c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef struct {
570c1bc742181ded4930842b46e9507372f0b1b963James Dong    u8 *data;           /* 16-byte aligned pointer of pAllocatedData */
580c1bc742181ded4930842b46e9507372f0b1b963James Dong    u8 *pAllocatedData; /* allocated picture pointer; (size + 15) bytes */
590c1bc742181ded4930842b46e9507372f0b1b963James Dong    i32 picNum;
600c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 frameNum;
610c1bc742181ded4930842b46e9507372f0b1b963James Dong    i32 picOrderCnt;
620c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpbPictureStatus_e status;
630c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 toBeDisplayed;
640c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 picId;
650c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 numErrMbs;
660c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 isIdr;
670c1bc742181ded4930842b46e9507372f0b1b963James Dong} dpbPicture_t;
680c1bc742181ded4930842b46e9507372f0b1b963James Dong
690c1bc742181ded4930842b46e9507372f0b1b963James Dong/* structure to represent display image output from the buffer */
700c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef struct {
710c1bc742181ded4930842b46e9507372f0b1b963James Dong    u8 *data;
720c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 picId;
730c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 numErrMbs;
740c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 isIdr;
750c1bc742181ded4930842b46e9507372f0b1b963James Dong} dpbOutPicture_t;
760c1bc742181ded4930842b46e9507372f0b1b963James Dong
770c1bc742181ded4930842b46e9507372f0b1b963James Dong/* structure to represent DPB */
780c1bc742181ded4930842b46e9507372f0b1b963James Dongtypedef struct {
790c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpbPicture_t *buffer;
800c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpbPicture_t **list;
810c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpbPicture_t *currentOut;
820c1bc742181ded4930842b46e9507372f0b1b963James Dong    dpbOutPicture_t *outBuf;
830c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 numOut;
840c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 outIndex;
850c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 maxRefFrames;
860c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 dpbSize;
870c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 maxFrameNum;
880c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 maxLongTermFrameIdx;
890c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 numRefFrames;
900c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 fullness;
910c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 prevRefFrameNum;
920c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 lastContainsMmco5;
930c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 noReordering;
940c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 flushed;
950c1bc742181ded4930842b46e9507372f0b1b963James Dong} dpbStorage_t;
960c1bc742181ded4930842b46e9507372f0b1b963James Dong
970c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
980c1bc742181ded4930842b46e9507372f0b1b963James Dong    4. Function prototypes
990c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
1000c1bc742181ded4930842b46e9507372f0b1b963James Dong
1010c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdInitDpb(
1020c1bc742181ded4930842b46e9507372f0b1b963James Dong  dpbStorage_t *dpb,
1030c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 picSizeInMbs,
1040c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 dpbSize,
1050c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 numRefFrames,
1060c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 maxFrameNum,
1070c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 noReordering);
1080c1bc742181ded4930842b46e9507372f0b1b963James Dong
1090c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdResetDpb(
1100c1bc742181ded4930842b46e9507372f0b1b963James Dong  dpbStorage_t *dpb,
1110c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 picSizeInMbs,
1120c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 dpbSize,
1130c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 numRefFrames,
1140c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 maxFrameNum,
1150c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 noReordering);
1160c1bc742181ded4930842b46e9507372f0b1b963James Dong
1170c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid h264bsdInitRefPicList(dpbStorage_t *dpb);
1180c1bc742181ded4930842b46e9507372f0b1b963James Dong
1190c1bc742181ded4930842b46e9507372f0b1b963James Dongu8* h264bsdAllocateDpbImage(dpbStorage_t *dpb);
1200c1bc742181ded4930842b46e9507372f0b1b963James Dong
1210c1bc742181ded4930842b46e9507372f0b1b963James Dongu8* h264bsdGetRefPicData(dpbStorage_t *dpb, u32 index);
1220c1bc742181ded4930842b46e9507372f0b1b963James Dong
1230c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdReorderRefPicList(
1240c1bc742181ded4930842b46e9507372f0b1b963James Dong  dpbStorage_t *dpb,
1250c1bc742181ded4930842b46e9507372f0b1b963James Dong  refPicListReordering_t *order,
1260c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 currFrameNum,
1270c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 numRefIdxActive);
1280c1bc742181ded4930842b46e9507372f0b1b963James Dong
1290c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdMarkDecRefPic(
1300c1bc742181ded4930842b46e9507372f0b1b963James Dong  dpbStorage_t *dpb,
1310c1bc742181ded4930842b46e9507372f0b1b963James Dong  decRefPicMarking_t *mark,
1320c1bc742181ded4930842b46e9507372f0b1b963James Dong  image_t *image,
1330c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 frameNum,
1340c1bc742181ded4930842b46e9507372f0b1b963James Dong  i32 picOrderCnt,
1350c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 isIdr,
1360c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 picId,
1370c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 numErrMbs);
1380c1bc742181ded4930842b46e9507372f0b1b963James Dong
1390c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdCheckGapsInFrameNum(dpbStorage_t *dpb, u32 frameNum, u32 isRefPic,
1400c1bc742181ded4930842b46e9507372f0b1b963James Dong                               u32 gapsAllowed);
1410c1bc742181ded4930842b46e9507372f0b1b963James Dong
1420c1bc742181ded4930842b46e9507372f0b1b963James DongdpbOutPicture_t* h264bsdDpbOutputPicture(dpbStorage_t *dpb);
1430c1bc742181ded4930842b46e9507372f0b1b963James Dong
1440c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid h264bsdFlushDpb(dpbStorage_t *dpb);
1450c1bc742181ded4930842b46e9507372f0b1b963James Dong
1460c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid h264bsdFreeDpb(dpbStorage_t *dpb);
1470c1bc742181ded4930842b46e9507372f0b1b963James Dong
1480c1bc742181ded4930842b46e9507372f0b1b963James Dong#endif /* #ifdef H264SWDEC_DPB_H */
1490c1bc742181ded4930842b46e9507372f0b1b963James Dong
150