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 23 class VideoDecoderAVC : public VideoDecoderBase { 24 public: 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 33 protected: 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 59 private: 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 }; 81 82 83 84 #endif /* VIDEO_DECODER_AVC_H_ */ 85