blob: ba3b2da7726e3d0221079eee139e96f7c74306b9 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*------------------------------------------------------------------------------
Table of contents
1. Include headers
2. Module defines
3. Data types
4. Function prototypes
------------------------------------------------------------------------------*/
#ifndef H264SWDEC_STORAGE_H
#define H264SWDEC_STORAGE_H
/*------------------------------------------------------------------------------
1. Include headers
------------------------------------------------------------------------------*/
#include "basetype.h"
#include "h264bsd_cfg.h"
#include "h264bsd_seq_param_set.h"
#include "h264bsd_pic_param_set.h"
#include "h264bsd_macroblock_layer.h"
#include "h264bsd_nal_unit.h"
#include "h264bsd_slice_header.h"
#include "h264bsd_seq_param_set.h"
#include "h264bsd_dpb.h"
#include "h264bsd_pic_order_cnt.h"
/*------------------------------------------------------------------------------
2. Module defines
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
3. Data types
------------------------------------------------------------------------------*/
typedef struct
{
u32 sliceId;
u32 numDecodedMbs;
u32 lastMbAddr;
} sliceStorage_t;
/* structure to store parameters needed for access unit boundary checking */
typedef struct
{
nalUnit_t nuPrev[1];
u32 prevFrameNum;
u32 prevIdrPicId;
u32 prevPicOrderCntLsb;
i32 prevDeltaPicOrderCntBottom;
i32 prevDeltaPicOrderCnt[2];
u32 firstCallFlag;
} aubCheck_t;
/* storage data structure, holds all data of a decoder instance */
typedef struct
{
/* active paramet set ids and pointers */
u32 oldSpsId;
u32 activePpsId;
u32 activeSpsId;
picParamSet_t *activePps;
seqParamSet_t *activeSps;
seqParamSet_t *sps[MAX_NUM_SEQ_PARAM_SETS];
picParamSet_t *pps[MAX_NUM_PIC_PARAM_SETS];
/* current slice group map, recomputed for each slice */
u32 *sliceGroupMap;
u32 picSizeInMbs;
/* this flag is set after all macroblocks of a picture successfully
* decoded -> redundant slices not decoded */
u32 skipRedundantSlices;
u32 picStarted;
/* flag to indicate if current access unit contains any valid slices */
u32 validSliceInAccessUnit;
/* store information needed for handling of slice decoding */
sliceStorage_t slice[1];
/* number of concealed macroblocks in the current image */
u32 numConcealedMbs;
/* picId given by application */
u32 currentPicId;
/* macroblock specific storages, size determined by image dimensions */
mbStorage_t *mb;
/* flag to store noOutputReordering flag set by the application */
u32 noReordering;
/* DPB */
dpbStorage_t dpb[1];
/* structure to store picture order count related information */
pocStorage_t poc[1];
/* access unit boundary checking related data */
aubCheck_t aub[1];
/* current processed image */
image_t currImage[1];
/* last valid NAL unit header is stored here */
nalUnit_t prevNalUnit[1];
/* slice header, second structure used as a temporary storage while
* decoding slice header, first one stores last successfully decoded
* slice header */
sliceHeader_t sliceHeader[2];
/* fields to store old stream buffer pointers, needed when only part of
* a stream buffer is processed by h264bsdDecode function */
u32 prevBufNotFinished;
u8 *prevBufPointer;
u32 prevBytesConsumed;
strmData_t strm[1];
/* macroblock layer structure, there is no need to store this but it
* would have increased the stack size excessively and needed to be
* allocated from head -> easiest to put it here */
macroblockLayer_t *mbLayer;
u32 pendingActivation; /* Activate parameter sets after returning
HEADERS_RDY to the user */
u32 intraConcealmentFlag; /* 0 gray picture for corrupted intra
1 previous frame used if available */
} storage_t;
/*------------------------------------------------------------------------------
4. Function prototypes
------------------------------------------------------------------------------*/
void h264bsdInitStorage(storage_t *pStorage);
void h264bsdResetStorage(storage_t *pStorage);
u32 h264bsdIsStartOfPicture(storage_t *pStorage);
u32 h264bsdIsEndOfPicture(storage_t *pStorage);
u32 h264bsdStoreSeqParamSet(storage_t *pStorage, seqParamSet_t *pSeqParamSet);
u32 h264bsdStorePicParamSet(storage_t *pStorage, picParamSet_t *pPicParamSet);
u32 h264bsdActivateParamSets(storage_t *pStorage, u32 ppsId, u32 isIdr);
void h264bsdComputeSliceGroupMap(storage_t *pStorage,
u32 sliceGroupChangeCycle);
u32 h264bsdCheckAccessUnitBoundary(
strmData_t *strm,
nalUnit_t *nuNext,
storage_t *storage,
u32 *accessUnitBoundaryFlag);
u32 h264bsdValidParamSets(storage_t *pStorage);
#endif /* #ifdef H264SWDEC_STORAGE_H */