/*
 * Copyright (C) 2014 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 __ISV_PROFILE_H
#define __ISV_PROFILE_H

#define MAX_BUF_SIZE (4 * 1024)
#define MAX_TAB_SIZE (10)
#define MAX_STRING_LEN (50)

#include <utils/RefBase.h>
using namespace android;

typedef enum _FRC_RATE {
    FRC_RATE_1X = 1,
    FRC_RATE_2X,
    FRC_RATE_2_5X,
    FRC_RATE_4X
} FRC_RATE;

typedef enum {
    VPP_COMMON_ON   = 1,        // VPP is on
    VPP_FRC_ON      = 1 << 1,   // FRC is on
} VPP_SETTING_STATUS;

typedef struct _ISVParameter {
    char name[MAX_STRING_LEN];
    float value;
} ISVParameter;

typedef struct _ISVConfig {
    bool enabled;
    uint32_t minResolution;
    uint32_t maxResolution;
    //bool isOn;
    ISVParameter paraTables[MAX_TAB_SIZE];
    uint32_t paraSize;
} ISVConfig;

typedef struct _ISVFRCRate {
    uint32_t input_fps;
    FRC_RATE rate;
} ISVFRCRate;

//FIXME: need align to ProcFilterType
typedef enum _FilterType {
    FilterNone                          = 0x00000001,
    FilterNoiseReduction                = 0x00000002,
    FilterDeinterlacing                 = 0x00000004,
    FilterSharpening                    = 0x00000008,
    FilterColorBalance                  = 0x00000010,
    FilterDeblocking                    = 0x00000020,
    FilterFrameRateConversion           = 0x00000040,
    FilterSkinToneEnhancement           = 0x00000080,
    FilterTotalColorCorrection          = 0x00000100,
    FilterNonLinearAnamorphicScaling    = 0x00000200,
    FilterImageStabilization            = 0x00000400,
} FilterType;

class ISVProfile : public RefBase
{
public:
    ISVProfile(const uint32_t width, const uint32_t height);
    ~ISVProfile();

    /* get the global ISV setting status */
    FRC_RATE getFRCRate(uint32_t inputFps);

    /* get filter config data
     * the filters' status are saved in uint32_t
     */
    uint32_t getFilterStatus();

    /* the global setting for VPP */
    static bool isVPPOn();

    /* the global setting for FRC */
    static bool isFRCOn();

private:
    /* Read the global setting for ISV */
    static int32_t getGlobalStatus();

    /* Get the config data from XML file */
    void getDataFromXmlFile(void);

    /* Update the filter status */
    void updateFilterStatus();

    /* handle the XML file */
    static void startElement(void *userData, const char *name, const char **atts);
    static void endElement(void *userData, const char *name);
    int getFilterID(const char * name);
    uint32_t getResolution(const char * name);
    void getConfigData(const char *name, const char **atts);
    void handleFilterParameter(const char *name, const char **atts);
    void handleCommonParameter(const char *name, const char **atts);

    /* dump the config data */
    void dumpConfigData();

    typedef enum _ProcFilterType {
        ProcFilterNone = 0,
        ProcFilterNoiseReduction,
        ProcFilterDeinterlacing,
        ProcFilterSharpening,
        ProcFilterColorBalance,
        ProcFilterDeblocking,
        ProcFilterFrameRateConversion,
        ProcFilterSkinToneEnhancement,
        ProcFilterTotalColorCorrection,
        ProcFilterNonLinearAnamorphicScaling,
        ProcFilterImageStabilization,
        ProcFilterCount
    } ProcFilterType;

private:
    uint32_t mWidth;
    uint32_t mHeight;

    /* The default value of VPP/FRC.
     * They will be read from config xml file.
     */
    int32_t mDefaultVPPStatus;
    int32_t mDefaultFRCStatus;

    /* the filters' status according to resolution
     * bit 0  used for ProcFilterNone
     * bit 1  used for ProcFilterNoiseReduction
     * ...
     * bit 10 used for ProcFilterImageStabilization
     */
    uint32_t mStatus;

    ISVConfig mConfigs[ProcFilterCount];
    uint32_t mCurrentFilter; //used by parasing xml file
    ISVFRCRate mFrcRates[MAX_TAB_SIZE];
    uint32_t mCurrentFrcTab;

    static const int mBufSize = MAX_BUF_SIZE;
};

#endif /* __ISV_PROFILE_H */