Home | History | Annotate | Download | only in dec
      1 /*
      2  *
      3  * Copyright 2012 Samsung Electronics S.LSI Co. LTD
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 /*
     19  * @file        Exynos_OMX_Vdec.h
     20  * @brief
     21  * @author      SeungBeom Kim (sbcrux.kim (at) samsung.com)
     22  *              HyeYeon Chung (hyeon.chung (at) samsung.com)
     23  *              Yunji Kim (yunji.kim (at) samsung.com)
     24  * @version     2.0.0
     25  * @history
     26  *   2012.02.20 : Create
     27  */
     28 
     29 #ifndef EXYNOS_OMX_VIDEO_DECODE
     30 #define EXYNOS_OMX_VIDEO_DECODE
     31 
     32 #include "OMX_Component.h"
     33 #include "Exynos_OMX_Def.h"
     34 #include "Exynos_OSAL_Queue.h"
     35 #include "Exynos_OMX_Baseport.h"
     36 #include "Exynos_OMX_Basecomponent.h"
     37 #include "ExynosVideoApi.h"
     38 
     39 #define MAX_VIDEO_INPUTBUFFER_NUM           5
     40 #define MAX_VIDEO_OUTPUTBUFFER_NUM          2
     41 
     42 #define DEFAULT_FRAME_WIDTH                 176
     43 #define DEFAULT_FRAME_HEIGHT                144
     44 
     45 #define DEFAULT_VIDEO_INPUT_BUFFER_SIZE    (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT) * 2
     46 #define DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE   (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT * 3) / 2
     47 
     48 #define MFC_INPUT_BUFFER_NUM_MAX            3
     49 #define DEFAULT_MFC_INPUT_BUFFER_SIZE       1920 * 1080 * 3 / 2
     50 
     51 #define MFC_OUTPUT_BUFFER_NUM_MAX           16 * 2
     52 #define DEFAULT_MFC_OUTPUT_YBUFFER_SIZE     1920 * 1080
     53 #define DEFAULT_MFC_OUTPUT_CBUFFER_SIZE     1920 * 1080 / 2
     54 
     55 #define INPUT_PORT_SUPPORTFORMAT_NUM_MAX    1
     56 #define OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX   4
     57 
     58 #define EXTRA_DPB_NUM                       5
     59 
     60 #define MFC_INPUT_BUFFER_PLANE              1
     61 #define MFC_OUTPUT_BUFFER_PLANE             2
     62 
     63 #define MAX_OUTPUTBUFFER_NUM_DYNAMIC        0 /* Dynamic number of metadata buffer */
     64 
     65 #define MAX_DISPLAY_EXTRA_BUFFER            2
     66 
     67 typedef struct
     68 {
     69     void *pAddrY;
     70     void *pAddrC;
     71 } CODEC_DEC_ADDR_INFO;
     72 
     73 typedef struct _CODEC_DEC_BUFFER
     74 {
     75     void *pVirAddr[MAX_BUFFER_PLANE];   /* virtual address   */
     76     int   bufferSize[MAX_BUFFER_PLANE]; /* buffer alloc size */
     77     int   fd[MAX_BUFFER_PLANE];         /* buffer FD */
     78     int   dataSize;                     /* total data length */
     79 } CODEC_DEC_BUFFER;
     80 
     81 typedef struct _DECODE_CODEC_EXTRA_BUFFERINFO
     82 {
     83     /* For Decode Output */
     84     OMX_U32 imageWidth;
     85     OMX_U32 imageHeight;
     86     OMX_COLOR_FORMATTYPE ColorFormat;
     87     PrivateDataShareBuffer PDSB;
     88 } DECODE_CODEC_EXTRA_BUFFERINFO;
     89 
     90 typedef struct _EXYNOS_OMX_VIDEODEC_COMPONENT
     91 {
     92     OMX_HANDLETYPE hCodecHandle;
     93     OMX_BOOL bThumbnailMode;
     94     OMX_BOOL bFirstFrame;
     95     CODEC_DEC_BUFFER *pMFCDecInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
     96     CODEC_DEC_BUFFER *pMFCDecOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
     97 
     98     /* Buffer Process */
     99     OMX_BOOL       bExitBufferProcessThread;
    100     OMX_HANDLETYPE hSrcInputThread;
    101     OMX_HANDLETYPE hSrcOutputThread;
    102     OMX_HANDLETYPE hDstInputThread;
    103     OMX_HANDLETYPE hDstOutputThread;
    104 
    105     /* Shared Memory Handle */
    106     OMX_HANDLETYPE hSharedMemory;
    107 
    108     /* For DRM Play */
    109     OMX_BOOL bDRMPlayerMode;
    110 
    111     /* For Reconfiguration DPB */
    112     OMX_BOOL bReconfigDPB;
    113 
    114     /* CSC handle */
    115     OMX_PTR csc_handle;
    116     OMX_U32 csc_set_format;
    117 
    118     OMX_HANDLETYPE hRefHandle;
    119 
    120     OMX_ERRORTYPE (*exynos_codec_srcInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
    121     OMX_ERRORTYPE (*exynos_codec_srcOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
    122     OMX_ERRORTYPE (*exynos_codec_dstInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
    123     OMX_ERRORTYPE (*exynos_codec_dstOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
    124 
    125     OMX_ERRORTYPE (*exynos_codec_start)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
    126     OMX_ERRORTYPE (*exynos_codec_stop)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
    127     OMX_ERRORTYPE (*exynos_codec_bufferProcessRun)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
    128     OMX_ERRORTYPE (*exynos_codec_enqueueAllBuffer)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
    129 
    130     int (*exynos_checkInputFrame) (OMX_U8 *pInputStream, OMX_U32 buffSize, OMX_U32 flag,
    131                                    OMX_BOOL bPreviousFrameEOF, OMX_BOOL *pbEndOfFrame);
    132     OMX_ERRORTYPE (*exynos_codec_getCodecInputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr, OMX_U32 *size);
    133     OMX_ERRORTYPE (*exynos_codec_getCodecOutputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr[], OMX_U32 size[]);
    134     OMX_ERRORTYPE (*exynos_codec_reconfigAllBuffers) (OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
    135 } EXYNOS_OMX_VIDEODEC_COMPONENT;
    136 
    137 #ifdef __cplusplus
    138 extern "C" {
    139 #endif
    140 
    141 int calc_plane(int width, int height);
    142 inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent);
    143 OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex);
    144 OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
    145 OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
    146 
    147 OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent);
    148 OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent);
    149 OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent);
    150 OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent);
    151 OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent);
    152 OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent);
    153 
    154 #ifdef __cplusplus
    155 }
    156 #endif
    157 
    158 #endif
    159