/******************************************************************************
*
* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
*
* 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.
*
******************************************************************************/
/**
*******************************************************************************
* @file
*  ihevc_func_selector.h
*
* @brief
*  For each function decide whether to use C function,  or Neon intrinsics
* or Cortex A8 intrinsics or Neon  assembly or cortex a8 assembly
*
* @author
*  Harish
*
* @remarks
*  None
*
*******************************************************************************
*/

#ifndef __IHEVC_FUNC_SELECTOR_H__
#define __IHEVC_FUNC_SELECTOR_H__


#include "ihevc_func_types.h"

#define     INTER_PRED_LUMA_COPY                    C
#define     INTER_PRED_LUMA_HORZ                    C
#define     INTER_PRED_LUMA_VERT                    C
#define     INTER_PRED_LUMA_COPY_W16OUT             C
#define     INTER_PRED_LUMA_HORZ_W16OUT             C
#define     INTER_PRED_LUMA_VERT_W16OUT             C
#define     INTER_PRED_LUMA_VERT_W16INP             C
#define     INTER_PRED_LUMA_VERT_W16INP_W16OUT      C

#define     INTER_PRED_CHROMA_COPY                  C
#define     INTER_PRED_CHROMA_HORZ                  C
#define     INTER_PRED_CHROMA_VERT                  C
#define     INTER_PRED_CHROMA_COPY_W16OUT           C
#define     INTER_PRED_CHROMA_HORZ_W16OUT           C
#define     INTER_PRED_CHROMA_VERT_W16OUT           C
#define     INTER_PRED_CHROMA_VERT_W16INP           C
#define     INTER_PRED_CHROMA_VERT_W16INP_W16OUT    C

#define     WEIGHTED_PRED_UNI                       C
#define     WEIGHTED_PRED_BI                        C
#define     WEIGHTED_PRED_BI_DEFAULT                C
#define    WEIGHTED_PRED_CHROMA_UNI                 C
#define    WEIGHTED_PRED_CHROMA_BI                  C
#define    WEIGHTED_PRED_CHROMA_BI_DEFAULT          C

#define     INTRA_PRED_LUMA_REF_SUBSTITUTION        C
#define     INTRA_PRED_REF_FILTERING                C
#define     INTRA_PRED_LUMA_PLANAR                  C
#define     INTRA_PRED_LUMA_DC                      C
#define     INTRA_PRED_LUMA_HORZ                    C
#define     INTRA_PRED_LUMA_VER                     C
#define     INTRA_PRED_LUMA_MODE_2                  C
#define     INTRA_PRED_LUMA_MODE_18_34              C
#define     INTRA_PRED_LUMA_MODE_3_TO_9             C
#define     INTRA_PRED_LUMA_MODE_11_TO_17           C
#define     INTRA_PRED_LUMA_MODE_19_TO_25           C
#define     INTRA_PRED_LUMA_MODE_27_TO_33           C


#define     INTRA_PRED_CHROMA_PLANAR                C
#define     INTRA_PRED_CHROMA_DC                    C
#define     INTRA_PRED_CHROMA_HOR                   C
#define     INTRA_PRED_CHROMA_VER                   C
#define     INTRA_PRED_CHROMA_MODE_2                C
#define     INTRA_PRED_CHROMA_18_34                 C
#define     INTRA_PRED_CHROMA_3_T0_9                C
#define     INTRA_PRED_CHROMA_11_T0_17              C
#define     INTRA_PRED_CHROMA_19_T0_25              C
#define     INTRA_PRED_CHROMA_27_T0_33              C
#define     INTRA_PRED_CHROMA_REF_SUBSTITUTION      C

#define     PAD_VERT                                C
#define     PAD_HORZ                                C

#define     DEBLK_LUMA_HORZ                         C
#define     DEBLK_LUMA_VERT                         C
#define     DEBLK_CHROMA_HORZ                       C
#define     DEBLK_CHROMA_VERT                       C

#define     SAO_BAND_OFFSET_LUMA                    C
#define     SAO_BAND_OFFSET_CHROMA                  C
#define     SAO_EDGE_OFFSET_CLASS0_LUMA             C
#define     SAO_EDGE_OFFSET_CLASS1_LUMA             C
#define     SAO_EDGE_OFFSET_CLASS2_LUMA             C
#define     SAO_EDGE_OFFSET_CLASS3_LUMA             C
#define     SAO_EDGE_OFFSET_CLASS0_CHROMA           C
#define     SAO_EDGE_OFFSET_CLASS1_CHROMA           C
#define     SAO_EDGE_OFFSET_CLASS2_CHROMA           C
#define     SAO_EDGE_OFFSET_CLASS3_CHROMA           C

/* Forward transform functions */
/* Luma */
#define RESI_TRANS_QUANT_4X4_TTYPE1                 C
#define RESI_TRANS_QUANT_4X4                        C
#define RESI_TRANS_QUANT_8X8                        C
#define RESI_TRANS_QUANT_16X16                      C
#define RESI_TRANS_QUANT_32X32                      C

#define RESI_QUANT_4X4_TTYPE1                       C
#define RESI_QUANT_4X4                              C
#define RESI_QUANT_8X8                              C
#define RESI_QUANT_16X16                            C
#define RESI_QUANT_32X32                            C

#define RESI_TRANS_4X4_TTYPE1                       C
#define RESI_TRANS_4X4                              C
#define RESI_TRANS_8X8                              C
#define RESI_TRANS_16X16                            C
#define RESI_TRANS_32X32                            C

#define RESI_4X4_TTYPE1                             C
#define RESI_4X4                                    C
#define RESI_8X8                                    C
#define RESI_16X16                                  C
#define RESI_32X32                                  C

#define TRANS_4X4_TTYPE1                            C
#define TRANS_4X4                                   C
#define TRANS_8X8                                   C
#define TRANS_16X16                                 C
#define TRANS_32X32                                 C

#define QUANT_4X4_TTYPE1                            C
#define QUANT_4X4                                   C
#define QUANT_8X8                                   C
#define QUANT_16X16                                 C
#define QUANT_32X32                                 C

/* Chroma interleaved*/
#define CHROMA_RESI_TRANS_QUANT_4X4                        C
#define CHROMA_RESI_TRANS_QUANT_8X8                        C
#define CHROMA_RESI_TRANS_QUANT_16X16                      C

#define CHROMA_RESI_QUANT_4X4                              C
#define CHROMA_RESI_QUANT_8X8                              C
#define CHROMA_RESI_QUANT_16X16                            C

#define CHROMA_RESI_TRANS_4X4                              C
#define CHROMA_RESI_TRANS_8X8                              C
#define CHROMA_RESI_TRANS_16X16                            C

#define CHROMA_RESI_4X4                                    C
#define CHROMA_RESI_8X8                                    C
#define CHROMA_RESI_16X16                                  C

/* Inverse transform functions */
/* Luma */
#define IQUANT_ITRANS_RECON_4X4_TTYPE1              C
#define IQUANT_ITRANS_RECON_4X4                     C
#define IQUANT_ITRANS_RECON_8X8                     C
#define IQUANT_ITRANS_RECON_16X16                   C
#define IQUANT_ITRANS_RECON_32X32                   C

#define IQUANT_RECON_4X4_TTYPE1                     C
#define IQUANT_RECON_4X4                            C
#define IQUANT_RECON_8X8                            C
#define IQUANT_RECON_16X16                          C
#define IQUANT_RECON_32X32                          C

#define ITRANS_RECON_4X4_TTYPE1                     C
#define ITRANS_RECON_4X4                            C
#define ITRANS_RECON_8X8                            C
#define ITRANS_RECON_16X16                          C
#define ITRANS_RECON_32X32                          C

#define RECON_4X4_TTYPE1                            C
#define RECON_4X4                                   C
#define RECON_8X8                                   C
#define RECON_16X16                                 C
#define RECON_32X32                                 C

#define ITRANS_4X4_TTYPE1                           C
#define ITRANS_4X4                                  C
#define ITRANS_8X8                                  C
#define ITRANS_16X16                                C
#define ITRANS_32X32                                C

/* Chroma interleaved */
#define CHROMA_IQUANT_ITRANS_RECON_4X4                     C
#define CHROMA_IQUANT_ITRANS_RECON_8X8                     C
#define CHROMA_IQUANT_ITRANS_RECON_16X16                   C

#define CHROMA_IQUANT_RECON_4X4                            C
#define CHROMA_IQUANT_RECON_8X8                            C
#define CHROMA_IQUANT_RECON_16X16                          C

#define CHROMA_ITRANS_RECON_4X4                            C
#define CHROMA_ITRANS_RECON_8X8                            C
#define CHROMA_ITRANS_RECON_16X16                          C

#define CHROMA_RECON_4X4                                   C
#define CHROMA_RECON_8X8                                   C
#define CHROMA_RECON_16X16                                 C

#define IHEVC_MEMCPY                                C
#define IHEVC_MEMSET                                C
#define IHEVC_MEMSET_16BIT                          C
#define IHEVC_MEMCPY_MUL_8                          C
#define IHEVC_MEMSET_MUL_8                          C
#define IHEVC_MEMSET_16BIT_MUL_8                    C

#endif /* __IHEVC_FUNC_SELECTOR_H__ */