1 /* 2 * Copyright (c) 2012 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 18 19 #ifndef OMX_VIDEO_DECODER_VP9HWR_H_ 20 #define OMX_VIDEO_DECODER_VP9HWR_H_ 21 22 #include "OMXVideoDecoderBase.h" 23 #include "vpx/vpx_decoder.h" 24 #include "vpx/vpx_codec.h" 25 #include "vpx/vp8dx.h" 26 #include <va/va.h> 27 #include <va/va_android.h> 28 #include <va/va_tpi.h> 29 30 // VAAPI Allocator internal Mem ID 31 typedef struct vaapiMemId 32 { 33 VASurfaceID* m_surface; 34 unsigned int m_key; //Gralloc handle from which this srf was created 35 unsigned char* m_usrAddr; 36 bool m_render_done; 37 bool m_released; 38 }vaapiMemId; 39 40 typedef unsigned int Display; 41 #define ANDROID_DISPLAY_HANDLE 0x18c34078 42 43 #define DECODE_WITH_GRALLOC_BUFFER 44 #define VPX_DECODE_BORDER 0 45 46 #define MAX_NATIVE_BUFFER_COUNT 64 47 48 class OMXVideoDecoderVP9HWR : public OMXVideoDecoderBase { 49 public: 50 OMXVideoDecoderVP9HWR(); 51 virtual ~OMXVideoDecoderVP9HWR(); 52 vaapiMemId* extMIDs[MAX_NATIVE_BUFFER_COUNT]; 53 int extUtilBufferCount; 54 int extMappedNativeBufferCount; 55 unsigned int extNativeBufferSize; 56 // (or mapped from vaSurface) to a pre-set max size. 57 int extActualBufferStride; 58 int extActualBufferHeightStride; 59 60 protected: 61 virtual OMX_ERRORTYPE InitInputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput); 62 virtual OMX_ERRORTYPE ProcessorInit(void); 63 virtual OMX_ERRORTYPE ProcessorDeinit(void); 64 virtual OMX_ERRORTYPE ProcessorStop(void); 65 virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 portIndex); 66 virtual OMX_ERRORTYPE ProcessorProcess( 67 OMX_BUFFERHEADERTYPE ***pBuffers, 68 buffer_retain_t *retains, 69 OMX_U32 numberBuffers); 70 virtual OMX_ERRORTYPE ProcessorReset(void); 71 72 virtual OMX_ERRORTYPE ProcessorPreFillBuffer(OMX_BUFFERHEADERTYPE* buffer); 73 virtual bool IsAllBufferAvailable(void); 74 75 virtual OMX_ERRORTYPE PrepareConfigBuffer(VideoConfigBuffer *p); 76 virtual OMX_ERRORTYPE PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p); 77 78 virtual OMX_ERRORTYPE BuildHandlerList(void); 79 80 virtual OMX_ERRORTYPE FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuffer, 81 buffer_retain_t *retain, 82 OMX_U32 inportBufferFlags, 83 OMX_BOOL *isResolutionChange); 84 85 virtual OMX_ERRORTYPE HandleFormatChange(void); 86 87 virtual OMX_COLOR_FORMATTYPE GetOutputColorFormat(int width); 88 virtual OMX_ERRORTYPE GetDecoderOutputCropSpecific(OMX_PTR pStructure); 89 virtual OMX_ERRORTYPE GetNativeBufferUsageSpecific(OMX_PTR pStructure); 90 virtual OMX_ERRORTYPE SetNativeBufferModeSpecific(OMX_PTR pStructure); 91 92 friend int reallocVP9FrameBuffer(void *user_priv, unsigned int new_size, vpx_codec_frame_buffer_t *fb); 93 94 DECLARE_HANDLER(OMXVideoDecoderVP9HWR, ParamVideoVp9); 95 private: 96 OMX_ERRORTYPE initDecoder(); 97 OMX_ERRORTYPE destroyDecoder(); 98 99 enum { 100 // OMX_PARAM_PORTDEFINITIONTYPE 101 INPORT_MIN_BUFFER_COUNT = 1, 102 INPORT_ACTUAL_BUFFER_COUNT = 5, 103 INPORT_BUFFER_SIZE = 1382400, 104 OUTPORT_NATIVE_BUFFER_COUNT = 12, // 8 reference + 1 current + 3 for asynchronized mode 105 OUTPORT_ACTUAL_BUFFER_COUNT = 12, // for raw data mode 106 INTERNAL_MAX_FRAME_WIDTH = 1920, 107 INTERNAL_MAX_FRAME_HEIGHT = 1088, 108 }; 109 110 void *mCtx; 111 112 //OMX_VIDEO_PARAM_VP9TYPE mParamVp9; 113 vpx_codec_frame_buffer_t* mFrameBuffers; 114 int mNumFrameBuffer; 115 116 // These members are for Adaptive playback 117 uint32_t mDecodedImageWidth; 118 uint32_t mDecodedImageHeight; 119 uint32_t mDecodedImageNewWidth; 120 uint32_t mDecodedImageNewHeight; 121 122 Display* mDisplay; 123 VADisplay mVADisplay; 124 }; 125 126 #endif /* OMX_VIDEO_DECODER_VP9HWR_H_ */ 127 128