1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/*------------------------------------------------------------------------------
18
19    Table of contents
20
21    1. Include headers
22    2. Module defines
23    3. Data types
24    4. Function prototypes
25
26------------------------------------------------------------------------------*/
27
28#ifndef H264SWDEC_DPB_H
29#define H264SWDEC_DPB_H
30
31/*------------------------------------------------------------------------------
32    1. Include headers
33------------------------------------------------------------------------------*/
34
35#include "basetype.h"
36#include "h264bsd_slice_header.h"
37#include "h264bsd_image.h"
38
39/*------------------------------------------------------------------------------
40    2. Module defines
41------------------------------------------------------------------------------*/
42
43/*------------------------------------------------------------------------------
44    3. Data types
45------------------------------------------------------------------------------*/
46
47/* enumeration to represent status of buffered image */
48typedef enum {
49    UNUSED = 0,
50    NON_EXISTING,
51    SHORT_TERM,
52    LONG_TERM
53} dpbPictureStatus_e;
54
55/* structure to represent a buffered picture */
56typedef struct {
57    u8 *data;           /* 16-byte aligned pointer of pAllocatedData */
58    u8 *pAllocatedData; /* allocated picture pointer; (size + 15) bytes */
59    i32 picNum;
60    u32 frameNum;
61    i32 picOrderCnt;
62    dpbPictureStatus_e status;
63    u32 toBeDisplayed;
64    u32 picId;
65    u32 numErrMbs;
66    u32 isIdr;
67} dpbPicture_t;
68
69/* structure to represent display image output from the buffer */
70typedef struct {
71    u8 *data;
72    u32 picId;
73    u32 numErrMbs;
74    u32 isIdr;
75} dpbOutPicture_t;
76
77/* structure to represent DPB */
78typedef struct {
79    dpbPicture_t *buffer;
80    dpbPicture_t **list;
81    dpbPicture_t *currentOut;
82    dpbOutPicture_t *outBuf;
83    u32 numOut;
84    u32 outIndex;
85    u32 maxRefFrames;
86    u32 dpbSize;
87    u32 maxFrameNum;
88    u32 maxLongTermFrameIdx;
89    u32 numRefFrames;
90    u32 fullness;
91    u32 prevRefFrameNum;
92    u32 lastContainsMmco5;
93    u32 noReordering;
94    u32 flushed;
95} dpbStorage_t;
96
97/*------------------------------------------------------------------------------
98    4. Function prototypes
99------------------------------------------------------------------------------*/
100
101u32 h264bsdInitDpb(
102  dpbStorage_t *dpb,
103  u32 picSizeInMbs,
104  u32 dpbSize,
105  u32 numRefFrames,
106  u32 maxFrameNum,
107  u32 noReordering);
108
109u32 h264bsdResetDpb(
110  dpbStorage_t *dpb,
111  u32 picSizeInMbs,
112  u32 dpbSize,
113  u32 numRefFrames,
114  u32 maxFrameNum,
115  u32 noReordering);
116
117void h264bsdInitRefPicList(dpbStorage_t *dpb);
118
119u8* h264bsdAllocateDpbImage(dpbStorage_t *dpb);
120
121u8* h264bsdGetRefPicData(dpbStorage_t *dpb, u32 index);
122
123u32 h264bsdReorderRefPicList(
124  dpbStorage_t *dpb,
125  refPicListReordering_t *order,
126  u32 currFrameNum,
127  u32 numRefIdxActive);
128
129u32 h264bsdMarkDecRefPic(
130  dpbStorage_t *dpb,
131  decRefPicMarking_t *mark,
132  image_t *image,
133  u32 frameNum,
134  i32 picOrderCnt,
135  u32 isIdr,
136  u32 picId,
137  u32 numErrMbs);
138
139u32 h264bsdCheckGapsInFrameNum(dpbStorage_t *dpb, u32 frameNum, u32 isRefPic,
140                               u32 gapsAllowed);
141
142dpbOutPicture_t* h264bsdDpbOutputPicture(dpbStorage_t *dpb);
143
144void h264bsdFlushDpb(dpbStorage_t *dpb);
145
146void h264bsdFreeDpb(dpbStorage_t *dpb);
147
148#endif /* #ifdef H264SWDEC_DPB_H */
149
150