1/* 2* Copyright (c) 2009-2011 Intel Corporation. All rights reserved. 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#ifndef VIDEO_DECODER_AVC_H_ 18#define VIDEO_DECODER_AVC_H_ 19 20#include "VideoDecoderBase.h" 21 22 23class VideoDecoderAVC : public VideoDecoderBase { 24public: 25 VideoDecoderAVC(const char *mimeType); 26 virtual ~VideoDecoderAVC(); 27 28 virtual Decode_Status start(VideoConfigBuffer *buffer); 29 virtual void stop(void); 30 virtual void flush(void); 31 virtual Decode_Status decode(VideoDecodeBuffer *buffer); 32 33protected: 34 virtual Decode_Status decodeFrame(VideoDecodeBuffer *buffer, vbp_data_h264 *data); 35 virtual Decode_Status beginDecodingFrame(vbp_data_h264 *data); 36 virtual Decode_Status continueDecodingFrame(vbp_data_h264 *data); 37 virtual Decode_Status decodeSlice(vbp_data_h264 *data, uint32_t picIndex, uint32_t sliceIndex); 38 Decode_Status setReference(VASliceParameterBufferH264 *sliceParam); 39 Decode_Status updateDPB(VAPictureParameterBufferH264 *picParam); 40 Decode_Status updateReferenceFrames(vbp_picture_data_h264 *picData); 41 void removeReferenceFromDPB(VAPictureParameterBufferH264 *picParam); 42 int32_t getPOC(VAPictureH264 *pic); // Picture Order Count 43 inline VASurfaceID findSurface(VAPictureH264 *pic); 44 inline VideoSurfaceBuffer* findSurfaceBuffer(VAPictureH264 *pic); 45 inline VideoSurfaceBuffer* findRefSurfaceBuffer(VAPictureH264 *pic); 46 inline void invalidateDPB(int toggle); 47 inline void clearAsReference(int toggle); 48 Decode_Status startVA(vbp_data_h264 *data); 49 void updateFormatInfo(vbp_data_h264 *data); 50 Decode_Status handleNewSequence(vbp_data_h264 *data); 51 bool isNewFrame(vbp_data_h264 *data, bool equalPTS); 52 int32_t getDPBSize(vbp_data_h264 *data); 53 virtual Decode_Status checkHardwareCapability(); 54#ifdef USE_AVC_SHORT_FORMAT 55 virtual Decode_Status getCodecSpecificConfigs(VAProfile profile, VAConfigID*config); 56#endif 57 bool isWiDiStatusChanged(); 58 59private: 60 struct DecodedPictureBuffer { 61 VideoSurfaceBuffer *surfaceBuffer; 62 int32_t poc; // Picture Order Count 63 }; 64 65 enum { 66 AVC_EXTRA_SURFACE_NUMBER = 11, 67 // maximum DPB (Decoded Picture Buffer) size 68 MAX_REF_NUMBER = 16, 69 DPB_SIZE = 17, // DPB_SIZE = MAX_REF_NUMBER + 1, 70 REF_LIST_SIZE = 32, 71 }; 72 73 // maintain 2 ping-pong decoded picture buffers 74 DecodedPictureBuffer mDPBs[2][DPB_SIZE]; 75 uint8_t mToggleDPB; // 0 or 1 76 bool mErrorConcealment; 77 uint32_t mLastPictureFlags; 78 VideoExtensionBuffer mExtensionBuffer; 79 PackedFrameData mPackedFrame; 80 bool mAdaptive; 81}; 82 83 84 85#endif /* VIDEO_DECODER_AVC_H_ */ 86