Home | History | Annotate | Download | only in videocodec
      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