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_STORAGE_H
29 #define H264SWDEC_STORAGE_H
30 
31 /*------------------------------------------------------------------------------
32     1. Include headers
33 ------------------------------------------------------------------------------*/
34 
35 #include "basetype.h"
36 #include "h264bsd_cfg.h"
37 #include "h264bsd_seq_param_set.h"
38 #include "h264bsd_pic_param_set.h"
39 #include "h264bsd_macroblock_layer.h"
40 #include "h264bsd_nal_unit.h"
41 #include "h264bsd_slice_header.h"
42 #include "h264bsd_seq_param_set.h"
43 #include "h264bsd_dpb.h"
44 #include "h264bsd_pic_order_cnt.h"
45 
46 /*------------------------------------------------------------------------------
47     2. Module defines
48 ------------------------------------------------------------------------------*/
49 
50 /*------------------------------------------------------------------------------
51     3. Data types
52 ------------------------------------------------------------------------------*/
53 
54 typedef struct
55 {
56     u32 sliceId;
57     u32 numDecodedMbs;
58     u32 lastMbAddr;
59 } sliceStorage_t;
60 
61 /* structure to store parameters needed for access unit boundary checking */
62 typedef struct
63 {
64     nalUnit_t nuPrev[1];
65     u32 prevFrameNum;
66     u32 prevIdrPicId;
67     u32 prevPicOrderCntLsb;
68     i32 prevDeltaPicOrderCntBottom;
69     i32 prevDeltaPicOrderCnt[2];
70     u32 firstCallFlag;
71 } aubCheck_t;
72 
73 /* storage data structure, holds all data of a decoder instance */
74 typedef struct
75 {
76     /* active paramet set ids and pointers */
77     u32 oldSpsId;
78     u32 activePpsId;
79     u32 activeSpsId;
80     picParamSet_t *activePps;
81     seqParamSet_t *activeSps;
82     seqParamSet_t *sps[MAX_NUM_SEQ_PARAM_SETS];
83     picParamSet_t *pps[MAX_NUM_PIC_PARAM_SETS];
84 
85     /* current slice group map, recomputed for each slice */
86     u32 *sliceGroupMap;
87 
88     u32 picSizeInMbs;
89 
90     /* this flag is set after all macroblocks of a picture successfully
91      * decoded -> redundant slices not decoded */
92     u32 skipRedundantSlices;
93     u32 picStarted;
94 
95     /* flag to indicate if current access unit contains any valid slices */
96     u32 validSliceInAccessUnit;
97 
98     /* store information needed for handling of slice decoding */
99     sliceStorage_t slice[1];
100 
101     /* number of concealed macroblocks in the current image */
102     u32 numConcealedMbs;
103 
104     /* picId given by application */
105     u32 currentPicId;
106 
107     /* macroblock specific storages, size determined by image dimensions */
108     mbStorage_t *mb;
109 
110     /* flag to store noOutputReordering flag set by the application */
111     u32 noReordering;
112 
113     /* DPB */
114     dpbStorage_t dpb[1];
115 
116     /* structure to store picture order count related information */
117     pocStorage_t poc[1];
118 
119     /* access unit boundary checking related data */
120     aubCheck_t aub[1];
121 
122     /* current processed image */
123     image_t currImage[1];
124 
125     /* last valid NAL unit header is stored here */
126     nalUnit_t prevNalUnit[1];
127 
128     /* slice header, second structure used as a temporary storage while
129      * decoding slice header, first one stores last successfully decoded
130      * slice header */
131     sliceHeader_t sliceHeader[2];
132 
133     /* fields to store old stream buffer pointers, needed when only part of
134      * a stream buffer is processed by h264bsdDecode function */
135     u32 prevBufNotFinished;
136     u8 *prevBufPointer;
137     u32 prevBytesConsumed;
138     strmData_t strm[1];
139 
140     /* macroblock layer structure, there is no need to store this but it
141      * would have increased the stack size excessively and needed to be
142      * allocated from head -> easiest to put it here */
143     macroblockLayer_t *mbLayer;
144 
145     u32 pendingActivation; /* Activate parameter sets after returning
146                               HEADERS_RDY to the user */
147     u32 intraConcealmentFlag; /* 0 gray picture for corrupted intra
148                                  1 previous frame used if available */
149 } storage_t;
150 
151 /*------------------------------------------------------------------------------
152     4. Function prototypes
153 ------------------------------------------------------------------------------*/
154 
155 void h264bsdInitStorage(storage_t *pStorage);
156 void h264bsdResetStorage(storage_t *pStorage);
157 u32 h264bsdIsStartOfPicture(storage_t *pStorage);
158 u32 h264bsdIsEndOfPicture(storage_t *pStorage);
159 u32 h264bsdStoreSeqParamSet(storage_t *pStorage, seqParamSet_t *pSeqParamSet);
160 u32 h264bsdStorePicParamSet(storage_t *pStorage, picParamSet_t *pPicParamSet);
161 u32 h264bsdActivateParamSets(storage_t *pStorage, u32 ppsId, u32 isIdr);
162 void h264bsdComputeSliceGroupMap(storage_t *pStorage,
163     u32 sliceGroupChangeCycle);
164 
165 u32 h264bsdCheckAccessUnitBoundary(
166   strmData_t *strm,
167   nalUnit_t *nuNext,
168   storage_t *storage,
169   u32 *accessUnitBoundaryFlag);
170 
171 u32 h264bsdValidParamSets(storage_t *pStorage);
172 
173 #endif /* #ifdef H264SWDEC_STORAGE_H */
174 
175