aboutsummaryrefslogtreecommitdiffstats
path: root/videocodec/OMXVideoDecoderVP9HWR.h
blob: 069b182d6ed1c9870b7999d1ed94565ad37cb966 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
* Copyright (c) 2012 Intel Corporation.  All rights reserved.
*
* 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.
*/



#ifndef OMX_VIDEO_DECODER_VP9HWR_H_
#define OMX_VIDEO_DECODER_VP9HWR_H_

#include "OMXVideoDecoderBase.h"
#include "vpx/vpx_decoder.h"
#include "vpx/vpx_codec.h"
#include "vpx/vp8dx.h"
#include <va/va.h>
#include <va/va_android.h>
#include <va/va_tpi.h>

// VAAPI Allocator internal Mem ID
typedef struct vaapiMemId
{
    VASurfaceID*       m_surface;
    unsigned int       m_key; //Gralloc handle from which this srf was created
    unsigned char*     m_usrAddr;
    bool               m_render_done;
    bool               m_released;
}vaapiMemId;

typedef unsigned int Display;
#define ANDROID_DISPLAY_HANDLE 0x18c34078

#define DECODE_WITH_GRALLOC_BUFFER
#define VPX_DECODE_BORDER 0

// Make it global to be accessed by callback realloc func
#define MAX_NATIVE_BUFFER_COUNT 64
vaapiMemId* extMIDs[MAX_NATIVE_BUFFER_COUNT];
int extUtilBufferCount;
int extMappedNativeBufferCount;
unsigned int extNativeBufferSize;

// These two strides are passed into libvpx to indicate the external buffer size
// in case that video demension is smaller than these, libvpx inside should
// ajust the start point of address of decoded y/v/u component.
// This is especially for adaptive playback case. External buffer is always allocated
// (or mapped from vaSurface) to a pre-set max size.
int extActualBufferStride;
int extActualBufferHeightStride;

class OMXVideoDecoderVP9HWR : public OMXVideoDecoderBase {
public:
    OMXVideoDecoderVP9HWR();
    virtual ~OMXVideoDecoderVP9HWR();

protected:
    virtual OMX_ERRORTYPE InitInputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput);
    virtual OMX_ERRORTYPE ProcessorInit(void);
    virtual OMX_ERRORTYPE ProcessorDeinit(void);
    virtual OMX_ERRORTYPE ProcessorStop(void);
    virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 portIndex);
    virtual OMX_ERRORTYPE ProcessorProcess(
            OMX_BUFFERHEADERTYPE ***pBuffers,
            buffer_retain_t *retains,
            OMX_U32 numberBuffers);
    virtual OMX_ERRORTYPE ProcessorReset(void);

    virtual OMX_ERRORTYPE ProcessorPreFillBuffer(OMX_BUFFERHEADERTYPE* buffer);
    virtual bool IsAllBufferAvailable(void);

    virtual OMX_ERRORTYPE PrepareConfigBuffer(VideoConfigBuffer *p);
    virtual OMX_ERRORTYPE PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p);

    virtual OMX_ERRORTYPE BuildHandlerList(void);

    virtual OMX_ERRORTYPE FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuffer,
                                           buffer_retain_t *retain,
                                           OMX_U32 inportBufferFlags,
                                           OMX_BOOL *isResolutionChange);

    virtual OMX_ERRORTYPE HandleFormatChange(void);

    virtual OMX_COLOR_FORMATTYPE GetOutputColorFormat(int width);
    virtual OMX_ERRORTYPE GetDecoderOutputCropSpecific(OMX_PTR pStructure);
    virtual OMX_ERRORTYPE GetNativeBufferUsageSpecific(OMX_PTR pStructure);
    virtual OMX_ERRORTYPE SetNativeBufferModeSpecific(OMX_PTR pStructure);

    friend int reallocVP9FrameBuffer(void *user_priv, unsigned int new_size, vpx_codec_frame_buffer_t *fb);

    DECLARE_HANDLER(OMXVideoDecoderVP9HWR, ParamVideoVp9);

private:
    OMX_ERRORTYPE initDecoder();
    OMX_ERRORTYPE destroyDecoder();

    enum {
        // OMX_PARAM_PORTDEFINITIONTYPE
        INPORT_MIN_BUFFER_COUNT = 1,
        INPORT_ACTUAL_BUFFER_COUNT = 5,
        INPORT_BUFFER_SIZE = 1382400,
        OUTPORT_NATIVE_BUFFER_COUNT = 12, // 8 reference + 1 current + 3 for asynchronized mode
        OUTPORT_ACTUAL_BUFFER_COUNT = 12,  // for raw data mode
        INTERNAL_MAX_FRAME_WIDTH = 1920,
        INTERNAL_MAX_FRAME_HEIGHT = 1088,
    };

    void *mCtx;

    //OMX_VIDEO_PARAM_VP9TYPE mParamVp9;
    vpx_codec_frame_buffer_t* mFrameBuffers;
    int mNumFrameBuffer;

    // These members are for Adaptive playback
    uint32_t mDecodedImageWidth;
    uint32_t mDecodedImageHeight;
    uint32_t mDecodedImageNewWidth;
    uint32_t mDecodedImageNewHeight;

    Display* mDisplay;
    VADisplay mVADisplay;
};

#endif /* OMX_VIDEO_DECODER_VP9HWR_H_ */