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_SECURE_H
18#define VIDEO_DECODER_AVC_SECURE_H
19
20#include "VideoDecoderBase.h"
21#include "VideoDecoderAVC.h"
22#include "VideoDecoderDefs.h"
23
24class VideoDecoderAVCSecure : public VideoDecoderAVC {
25public:
26    VideoDecoderAVCSecure(const char *mimeType);
27    virtual Decode_Status start(VideoConfigBuffer *buffer);
28    virtual void stop(void);
29
30    // data in the decoded buffer is all encrypted.
31    virtual Decode_Status decode(VideoDecodeBuffer *buffer);
32protected:
33    virtual Decode_Status decodeFrame(VideoDecodeBuffer *buffer, vbp_data_h264 *data);
34    virtual Decode_Status continueDecodingFrame(vbp_data_h264 *data);
35    virtual Decode_Status beginDecodingFrame(vbp_data_h264 *data);
36    virtual Decode_Status getCodecSpecificConfigs(VAProfile profile, VAConfigID*config);
37    Decode_Status parseClassicSliceHeader(vbp_data_h264 *data);
38    Decode_Status parseModularSliceHeader(vbp_data_h264 *data);
39
40    Decode_Status updateSliceParameter(vbp_data_h264 *data, void *sliceheaderbuf);
41    virtual Decode_Status decodeSlice(vbp_data_h264 *data, uint32_t picIndex, uint32_t sliceIndex);
42private:
43    Decode_Status processClassicInputBuffer(VideoDecodeBuffer *buffer, vbp_data_h264 **data);
44    Decode_Status processModularInputBuffer(VideoDecodeBuffer *buffer, vbp_data_h264 **data);
45    int32_t     mIsEncryptData;
46    int32_t     mFrameSize;
47    uint8_t*    mFrameData;
48    uint8_t*    mClearData;
49    uint8_t*    mCachedHeader;
50    int32_t     mFrameIdx;
51    int32_t     mModularMode;
52
53    enum {
54        MAX_SLICE_HEADER_NUM  = 256,
55    };
56    int32_t     mSliceNum;
57    // Information of Slices in the Modular DRM Mode
58    struct SliceInfo {
59        uint8_t     sliceHeaderByte;             //  first byte of the slice header
60        uint32_t    sliceStartOffset;            // offset of Slice unit in the firewalled buffer
61        uint32_t    sliceByteOffset;             // extra offset from the blockAligned slice offset
62        uint32_t    sliceSize;                   // block aligned length of slice unit
63        uint32_t    sliceLength;                 // actual size of the slice
64    };
65
66    SliceInfo mSliceInfo[MAX_SLICE_HEADER_NUM];
67};
68
69#endif
70