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};
81
82
83
84#endif /* VIDEO_DECODER_AVC_H_ */
85