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 */
48 typedef enum {
49     UNUSED = 0,
50     NON_EXISTING,
51     SHORT_TERM,
52     LONG_TERM
53 } dpbPictureStatus_e;
54 
55 /* structure to represent a buffered picture */
56 typedef 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 */
70 typedef struct {
71     u8 *data;
72     u32 picId;
73     u32 numErrMbs;
74     u32 isIdr;
75 } dpbOutPicture_t;
76 
77 /* structure to represent DPB */
78 typedef 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 
101 u32 h264bsdInitDpb(
102   dpbStorage_t *dpb,
103   u32 picSizeInMbs,
104   u32 dpbSize,
105   u32 numRefFrames,
106   u32 maxFrameNum,
107   u32 noReordering);
108 
109 u32 h264bsdResetDpb(
110   dpbStorage_t *dpb,
111   u32 picSizeInMbs,
112   u32 dpbSize,
113   u32 numRefFrames,
114   u32 maxFrameNum,
115   u32 noReordering);
116 
117 void h264bsdInitRefPicList(dpbStorage_t *dpb);
118 
119 u8* h264bsdAllocateDpbImage(dpbStorage_t *dpb);
120 
121 u8* h264bsdGetRefPicData(dpbStorage_t *dpb, u32 index);
122 
123 u32 h264bsdReorderRefPicList(
124   dpbStorage_t *dpb,
125   refPicListReordering_t *order,
126   u32 currFrameNum,
127   u32 numRefIdxActive);
128 
129 u32 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 
139 u32 h264bsdCheckGapsInFrameNum(dpbStorage_t *dpb, u32 frameNum, u32 isRefPic,
140                                u32 gapsAllowed);
141 
142 dpbOutPicture_t* h264bsdDpbOutputPicture(dpbStorage_t *dpb);
143 
144 void h264bsdFlushDpb(dpbStorage_t *dpb);
145 
146 void h264bsdFreeDpb(dpbStorage_t *dpb);
147 
148 #endif /* #ifdef H264SWDEC_DPB_H */
149 
150