summaryrefslogtreecommitdiff
path: root/iep_api.h
blob: 092bc1918f29bf05c947a8d3550be191d9a49d2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#ifndef IEP_API_H_
#define IEP_API_H_

#include "iep.h"

typedef enum IEP_VIDEO_MODE {
    IEP_VIDEO_MODE_BLACK_SCREEN,
    IEP_VIDEO_MODE_BLUE_SCREEN,
    IEP_VIDEO_MODE_COLOR_BAR,
    IEP_VIDEO_MODE_NORMAL_VIDEO
} IEP_VIDEO_MODE_t;

typedef struct iep_param_YUV_color_enhance {
    float               yuv_enh_saturation; // [0, 1.992]
    float               yuv_enh_contrast;   // [0, 1.992]
    signed char         yuv_enh_brightness; // [-32, 31]
    float               yuv_enh_hue_angle;  // [-30, 30]
    IEP_VIDEO_MODE_t    video_mode;
    unsigned char       color_bar_y;        // [0, 127]
    unsigned char       color_bar_u;        // [0, 127]
    unsigned char       color_bar_v;        // [0, 127]
} iep_param_YUV_color_enhance_t;

typedef enum IEP_RGB_COLOR_ENHANCE_MODE {
    IEP_RGB_COLOR_ENHANCE_MODE_NO_OPERATION,
    IEP_RGB_COLOR_ENHANCE_MODE_DENOISE,
    IEP_RGB_COLOR_ENHANCE_MODE_DETAIL_ENHANCE,
    IEP_RGB_COLOR_ENHANCE_MODE_EDGE_ENHANCE
} IEP_RGB_COLOR_ENHANCE_MODE_t;

typedef enum IEP_RGB_COLOR_ENHANCE_ORDER {
    IEP_RGB_COLOR_ENHANCE_ORDER_CG_DDE, // CG(Contrast & Gammar) prior to DDE (De-noise, Detail & Edge Enhance)
    IEP_RGB_COLOR_ENHANCE_ORDER_DDE_CG  // DDE prior to CG
} IEP_RGB_COLOR_ENHANCE_ORDER_t;

typedef struct iep_param_RGB_color_enhance {
    float                           rgb_enh_coe;        // [0, 3.96875]
    IEP_RGB_COLOR_ENHANCE_MODE_t    rgb_enhance_mode;
    uint8_t                         rgb_cg_en;          //sw_rgb_con_gam_en
    double                          cg_rr;
    double                          cg_rg;
    double                          cg_rb;
    IEP_RGB_COLOR_ENHANCE_ORDER_t   rgb_contrast_enhance_mode;

    /// more than this value considered as detail, and less than this value considered as noise.
    int                             enh_threshold;      // [0, 255]

    /// combine the original pixel and enhanced pixel
    /// if (enh_alpha_num / enh_alpha_base <= 1 ) enh_alpha_base = 8, else enh_alpha_base = 4
    /// (1/8 ... 8/8) (5/4 ... 24/4)
    int                             enh_alpha_num;      // [0, 24]
    int                             enh_alpha_base;     // {4, 8}
    int                             enh_radius;         // [1, 4]
} iep_param_RGB_color_enhance_t;

typedef enum IEP_SCALE_UP_MODE {
    IEP_SCALE_UP_MODE_HERMITE,
    IEP_SCALE_UP_MODE_SPLINE,
    IEP_SCALE_UP_MODE_CATROM,
    IEP_SCALE_UP_MODE_MITCHELL
} IEP_SCALE_UP_MODE_t;

typedef struct iep_param_scale {
    IEP_SCALE_UP_MODE_t                 scale_up_mode;
    //unsigned int                    dst_width_tile0;    // [0, 4095]
    //unsigned int                    dst_width_tile1;    // [0, 4095]
    //unsigned int                    dst_width_tile2;    // [0, 4095]
    //unsigned int                    dst_width_tile3;    // [0, 4095]
} iep_param_scale_t;

typedef enum IEP_FIELD_ORDER
{
    FIELD_ORDER_TOP_FIRST,
    FIELD_ORDER_BOTTOM_FIRST
} IEP_FIELD_ORDER_t;

typedef enum IEP_YUV_DEINTERLACE_MODE {
    IEP_DEINTERLACE_MODE_DISABLE,
    IEP_DEINTERLACE_MODE_I2O1,
    IEP_DEINTERLACE_MODE_I4O1,
    IEP_DEINTERLACE_MODE_I4O2,
    IEP_DEINTERLACE_MODE_BYPASS
} IEP_YUV_DEINTERLACE_MODE_t;

typedef struct iep_param_yuv_deinterlace {
    uint8_t                     high_freq_en;
    IEP_YUV_DEINTERLACE_MODE_t  dil_mode;
    IEP_FIELD_ORDER_t           field_order;
    uint8_t                     dil_high_freq_fct;  // [0, 127]
    uint8_t                     dil_ei_mode;        // deinterlace edge interpolation 0: disable, 1: enable
    uint8_t                     dil_ei_smooth;      // deinterlace edge interpolation for smooth effect 0: disable, 1: enable
    uint8_t                     dil_ei_sel;         // deinterlace edge interpolation select
    uint8_t                     dil_ei_radius;      // deinterlace edge interpolation radius [0, 3]
} iep_param_yuv_deinterlace_t;

typedef enum IEP_COLOR_CONVERT_MODE {
    IEP_COLOR_CONVERT_MODE_BT601_L,
    IEP_COLOR_CONVERT_MODE_BT601_F,
    IEP_COLOR_CONVERT_MODE_BT709_L,
    IEP_COLOR_CONVERT_MODE_BT709_F
} IEP_COLOR_CONVERT_MODE_t;

typedef struct iep_param_color_space_convertion {
    IEP_COLOR_CONVERT_MODE_t        rgb2yuv_mode;
    IEP_COLOR_CONVERT_MODE_t        yuv2rgb_mode;
    unsigned char                   rgb2yuv_input_clip; // 0:R/G/B [0, 255], 1:R/G/B [16, 235]
    unsigned char                   yuv2rgb_input_clip; // 0:Y/U/V [0, 255], 1:Y [16, 235] U/V [16, 240]
    unsigned char                   global_alpha_value; // global alpha value for output ARGB
    unsigned char                   dither_up_en;
    unsigned char                   dither_down_en;
} iep_param_color_space_convertion_t;

typedef struct iep_param_direct_path_interface {
    uint8_t                         enable;
    int                             off_x;
    int                             off_y;
    int                             width;
    int                             height;
    uint8_t                         layer;
} iep_param_direct_path_interface_t;

typedef enum IEP_QUERY_INTERLACE {
    IEP_QUERY_INTERLACE_UNSUPPORTED,
    IEP_QUERY_INTERLACE_I2O1_ONLY,
    IEP_QUERY_INTERLACE_FULL_FUNC
} IEP_QUERY_INTERLACE;

typedef enum IEP_QUERY_DIMENSION {
    IEP_QUERY_DIMENSION_1920,
    IEP_QUERY_DIMENSION_4096
} IEP_QUERY_DIMENSION;

typedef void (*iep_notify)(int result);

class iep_interface {
public:
    virtual ~iep_interface() {;}

    virtual int init(iep_img *src, iep_img *dst) = 0;
    virtual int config_src_dst(iep_img *src, iep_img *dst) = 0;
    virtual int config_yuv_enh() = 0;
    virtual int config_yuv_enh(iep_param_YUV_color_enhance_t *yuv_enh) = 0;
    virtual int config_color_enh() = 0;
    virtual int config_color_enh(iep_param_RGB_color_enhance_t *rgb_enh) = 0;
    virtual int config_scale() = 0;
    virtual int config_scale(iep_param_scale_t *scale) = 0;
    virtual int config_yuv_denoise() = 0;
    virtual int config_yuv_denoise(iep_img *src_itemp, iep_img *src_ftemp, iep_img *dst_itemp, iep_img *dst_ftemp) = 0;
    virtual int config_yuv_deinterlace() = 0;
    virtual int config_yuv_deinterlace(iep_param_yuv_deinterlace_t *yuv_dil) = 0;
    virtual int config_yuv_dil_src_dst(iep_img *src1, iep_img *dst1) = 0;
    virtual int config_yuv_deinterlace(iep_param_yuv_deinterlace_t *yuv_dil, iep_img *src1, iep_img *dst1) = 0;
    virtual int config_color_space_convertion() = 0;
    virtual int config_color_space_convertion(iep_param_color_space_convertion_t *clr_convert) = 0;
    virtual int config_direct_lcdc_path(iep_param_direct_path_interface_t *dpi) = 0;
    virtual int run_sync() = 0;
    virtual int run_async(iep_notify notify) = 0;
    virtual int poll() = 0;
    virtual struct IEP_CAP* query() = 0;
    virtual IEP_QUERY_INTERLACE query_interlace() = 0;
    virtual IEP_QUERY_DIMENSION query_dimension() = 0;
    
    static iep_interface* create_new();
    static void reclaim(iep_interface *iep_inf);
};

/// for dlopen 
iep_interface* iep_interface_create_new();
void iep_interface_reclaim(iep_interface *iep_inf);

/// for "C"
struct iep_ops {
    void* (*claim)();
    int (*init)(void *iep_obj, iep_img *src, iep_img *dst);
    int (*config_src_dst)(void *iep_obj, iep_img *src, iep_img *dst);
    int (*config_yuv_enh)(void *iep_obj);
    int (*config_yuv_enh_param)(void *iep_obj, iep_param_YUV_color_enhance_t *yuv_enh);
    int (*config_color_enh)(void *iep_obj);
    int (*config_color_enh_param)(void *iep_obj, iep_param_RGB_color_enhance_t *rgb_enh);
    int (*config_scale)(void *iep_obj);
    int (*config_scale_param)(void *iep_obj, iep_param_scale_t *scale);
    int (*config_yuv_denoise)(void *iep_obj);
    int (*config_yuv_deinterlace)(void *iep_obj);
    int (*config_yuv_deinterlace_param1)(void *iep_obj, iep_param_yuv_deinterlace_t *yuv_dil);
    int (*config_yuv_dil_src_dst)(void *iep_obj, iep_img *src1, iep_img *dst1);
    int (*config_yuv_deinterlace_param2)(void *iep_obj, iep_param_yuv_deinterlace_t *yuv_dil, iep_img *src1, iep_img *dst1);
    int (*config_color_space_convertion)(void *iep_obj);
    int (*config_color_space_convertion_param)(void *iep_obj, iep_param_color_space_convertion_t *clr_convert);
    int (*config_direct_lcdc_path)(void *iep_obj, iep_param_direct_path_interface_t *dpi);
    int (*run_sync)(void *iep_obj);
    int (*run_async)(void *iep_obj, iep_notify notify);
    int (*poll)(void *iep_obj);
    void (*reclaim)(void *iep_obj);
};

struct iep_ops* alloc_iep_ops();
void free_iep_ops(struct iep_ops *ops);

#endif